删除排序数组中的重复项II
题目描述:
给定一个增序排列数组 nums ,你需要在 原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。for (int i = 0; i < len; i++) {print(nums[i]);}提示:0 <= nums.length <= 3 * 10^4-10 ^4 <= nums[i] <= 10 ^4nums 按递增顺序排列
class Solution {
private int len;
private int[] nums;
public int removeDuplicates(int[] nums) {
this.len = nums.length;
this.nums = nums;
int result = this.len;
if(len == 1) return 1; // 特判
int count = 1;
for(int i = 0 ; i<len-1 ;){
if(i+1 == result) break; // 结束判断:i+1一定等于result时结束,因为result的值一定大于等于i+1
if(count < 2 && nums[i] == nums[i+1]){
count++;
i++;
}else if(count>=2 && nums[i] == nums[i+1]){
move(i+1);
result --;
}else{
count = 1; // 重置为1
i++;
}
}
return result;
}
private void move(int start){
for(int i = start ; i<len-1 ; i++){
nums[i] = nums[i+1];
}
}
}
按照题意即可,每次当前的数字连续超过两个时,则将该多余的数字用后面的数字覆盖。这里需要注意的是:结束条件应该有两个,一个就是i遍历完整个nums时,另一个就是当i+1等于result时。详细请看代码,有疑问欢迎留言。