题目描述:

  • 给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


与leetcode26优化后的结果差不多:
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前应该去重的数据数量来确定当前数据如果不重复应该移动的位置,不过题目要求是重复两次以上,所以额外再加一个变量记录重复次数。

这样分析会有三种情况

当前数据位置与索引位置相等:重复次数+1

且数据重复次数大于两次:则应该去重的数量+1
否则少于两次应该保留:即需要移动数据

当前数据位置与索引位置不相等:重复次数重置为1,保留(移动)数据

注意的是:移动数据的目的就是为了保留此数据,因为后面的数据不参与答案校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//代码如下
public int removeDuplicates(int[] nums) {
int res = 0;//重复的数据数
int count = 1;//重复次数

for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - res - 1]) {
count++;//重复次数+1
if (count > 2) {
res++;//重复次数大于两次:要去重的数量+1
}else {
nums[i - res] = nums[i];//少于两次重复次数应该移动数据进行保留
}
} else{
nums[i - res] = nums[i];//不相等,移动数据进行保留
count = 1;//重置重复次数
}
}
return nums.length - res;
}