题意是这样的,给你一个排好序的数组,要求生成一个新数组,里面的元素出现的次数不能大于N,如N=1,那么要求数组无重复元素,N=2,要求数组中一个元素最多出现2次,这两种情况对应题目版本 I 和 II,注意不能生成新数组,空间复杂度为O(1),改变后的数组的前半部分符合题意即可,如:
N = 1, 11223 ----> 12312
N= 2, 1112223 -----> 1122323
下面是时间复杂度O(n),空间复杂度O(1)的算法,算法思想是:
设可能含有重复数字的原数组为old,“去重”后的数组为new。我们要做的是:
1. 从old中取出元素放入new中。
2. 每次放入元素的时候检查是否符合去重条件?由于原数组有序,那么old数组中重复的元素一定出现在待检查的元素前面或后面,由于我们是从前向后选择元素放,那么只需检查前面是否有重复即可,所以当N=1,数组中不允许有重复元素时,那么检查new数组最后一个元素是否和当前元素相同,相同就放弃,不同放入元素组即可.
那么N= 2呢?只需检查倒数第二个元素是否和待放入相同即可,所以只需检查倒数第N个数,就能解决任意N的问题了,因为如果倒数第2个都相同了,数组又是排好序的,那么倒数第1个肯定也是相同的。
3. 具体实现只需维护两个指针,在数组中就是下标,符合条件就复制,不符合就跳过即可。代码如下(以N=2为例):
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
int ll = nums.size();
if(ll <= 2)return ll;
int index = 2;
for(int i = 2;i < ll; ++i)
{
if(nums[i] != nums[index - 2])
{
nums[index++] = nums[i];
}
}
return index;
}
};