题目链接
删除有序数组中的重复项 II
题目描述
注意点
- nums 已按升序排列
- 1 <= nums.length <= 30000
- 原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次
- 返回删除后数组的新长度
解答思路
- 因为数组是按升序排列的,可以使用将某个区间内除开头两个元素外的其他元素排除掉,并将这两个元素移动到数组前方,所以需要存储当前元素应该写入的位置idx,上一个不同元素preNum,当前相同元素的数量是否大于二excessive
- 遍历整个数组,对于任一元素,有以下几种情况:
(1)当前元素不等于preNum,相当于是一个新元素,写入到nums前方
(2)当前元素等于preNum但是当前该元素数量只有1个,也需要写入到nums前方
(3)当前元素等于preNum但是当前该元素数量已经有2个,不写入到nums中
代码
class Solution {
public int removeDuplicates(int[] nums) {
int idx = 1;
int preNum = nums[0];
boolean excessive = false;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != preNum) {
nums[idx] = nums[i];
preNum = nums[i];
excessive = false;
idx++;
} else {
if (!excessive) {
nums[idx] = nums[i];
idx++;
}
excessive = true;
}
}
return idx;
}
}
关键点
- idx、preNum、excessive的作用
- 遍历元素的各种情况对以上几个值的更新