题目描述:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例:
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
你不需要考虑数组中超出新长度后面的元素。
解题思路:
1.覆盖重复元素。
类似于双指针法,i 是遍历指针,指向当前遍历的元素;preIndex + 1指向下一个要覆盖元素的位置。用 count 记录当前数字出现的次数。count 的最小计数始终为 1。重复判断当前元素cur与前一个元素,三种情况分析:当前元素与前一个元素重复且count小于2则保留,放置在前一个元素的下一个位置,更新preIndex和count;当前元素与前一个元素重复且count大于等于2,则丢弃;当前元素与前一个元素不同则保留,放置在前一个元素的下一个位置,更新preIndex和count;如此循环下去最终返回preIndex + 1(因为是长度)即可。
复杂度分析:
由于一次遍历完成,时间复杂度O(N),空间复杂度O(1);
java代码如下:
class Solution {
public int removeDuplicates(int[] nums) {
int preIndex = 0,count = 1,cur;
for (int i = 1; i < nums.length; i++) {
cur = nums[i];
if((cur == nums[preIndex]) && count < 2){
nums[preIndex + 1] = nums[i];
preIndex = preIndex + 1;
count++;
}else if((cur == nums[preIndex]) && count >= 2){
continue;
}else {
nums[preIndex + 1] = nums[i];
preIndex = preIndex + 1;
count = 1;
}
}
return preIndex + 1;
}
}
运行结果如下: