LeetCode 80:Remove Duplicates from Sorted Array II(去除重复元素)
Q:Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twice and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
It doesn't matter what you leave beyond the returned length.
Example 1:
Given nums = [1,1,1,2,2,3],
Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3 respectively.
翻译君:一个已排好序的数组,对数组中的元素去重,使得数组中的相同元素最多只保留两个。返回去重后的的数组长度。
比如:
数组[1,1,1,2,2,3],结果要返回数组长度5,也就是最终数组变成[1,1,2,2,3]
注意(面试中需要和面试官交流的点)
可不可以用额外的辅助空间,这里题目已经明确只能使用O(1)的额外空间,也就是不能使用新的数组空间。
1.不可以用额外的辅助空间。这一点就直接把我们最容易想到的方法给毙了:
遍历一次数组,将未达到两次以上的元素放入新的数组中,然后返回长度。
2.那么不用额外的数组怎么解决呢???
注意题目有个条件的就是数组是排好序的,我们就要充分利用这个特点。
既然是已经排好序的,那么我就可以只借助一个变量作为删除完元素之后的数组的下标。然后我只要和该下标和它之前的两个元素不相同就好了。当然首先我需要将前两个元素直接放入该下标代表的元素中。
比如[1,1,1,1,2,2,2,2,2,3]
先定义一个变量count表示数组的下标(其实这个数组还是原数组,只不过我只通过覆盖改变它的位置元素)
(1)[1,1]直接放入
for(int i=0;i
(2)第二步是关键。
由于之前的count插入了两个元素,那么我就和i保持了两个单位。这样的话我接下来和i进行比较就相当于和我新下标的前两个元素进行比较。这样就能保证我新数组的元素重复元素不会超过两个。
那么只需要加上一个判断就好了
nums[i]>nums[count-2]
说那么多干啥这么抽象,上个图不就清楚了,请看图:
再结合一下完整的代码一起看应该可以理解了哈:
int removeDuplicates(vector& nums) {
int count=0;
for(int i=0;inums[count-2])
nums[count++]=nums[i];
}
return count;
}