80. 删除有序数组中的重复项 II
链接:link
思路:双指针
- 对于nums的长度小于等于2的就直接返回;
- 一个指针 i n d e x index index指向当前不重复的元素位置,一个指针 i i i遍历数组;
- 因为本题要求相同元素最多出现两次,所以我们需要检查上上个应该被保留的元素 n u m [ i n d e x − 2 ] num[index-2] num[index−2]是否与当前元素 n u m s [ i ] nums[i] nums[i]相等,若相等则跳过,若不相等则保留。
代码
public int removeDuplicates(int[] nums) {
// 如果数组长度小于等于2,则不需要删除重复元素,直接返回数组长度
if(nums.length <= 2) {
return nums.length;
}
// index变量用于记录新数组(去重后)的下一个可用位置
// 初始化为2,因为数组的前两个元素肯定是不重复的,我们保留它们
int index = 2;
// 从数组的第三个元素开始遍历(因为前两个元素已经保留)
for(int i = 2; i < nums.length; i++){
// 如果当前元素与前两个元素不同,说明它不是重复的,或者只重复了一次
// 所以我们可以将它放到新数组的下一个可用位置
if(nums[index - 2] != nums[i]) {
nums[index++] = nums[i];
}
}
// 返回新数组的长度,即index的值
// 注意:此时数组nums中,从索引0到index-1的位置是新数组的元素,
// 而索引index到nums.length-1的位置的元素是不需要的,但它们的值并未被修改
return index;
}