题目:
Follow up for “Remove Duplicates”:
What if duplicates are allowed at most twice?
For example,
Given sorted array 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. It doesn’t matter what you leave beyond the new length.
题意:
这道题是在数组中删除重复元素,不过这个重复的意思是元素出现的次数超过了两次,两次及以内可以保存,比如1,1,1,2,2,3,只有1出现了3次,所以需要去掉一个,2只出现了两次所以不需要删除,直接保留,最终的结果是1,1,2,2,3,所以返回数组的长度是5.
思路:
需要三个指针,一个是扫描的当前指针front,一个是与该front不相等元素的指针,还有一个指针store指向的是下一个用来存放元素的位置。
front指向当前元素,tail指向第一个与front不同的元素,如果tail-front == 1,那么只需要将nums[store] = nums[front],front++;否则只保留两个front的元素,即让nums[store] = nums[store +1]= nums[front],front += 2,front+2的位置保留tail所指元素。
代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size() <= 2)return nums.size();
int front = 0,tail = 0,store = 0;
while(tail < nums.size()){
while(tail < nums.size() && nums[tail] == nums[front])tail++;
switch(tail - front){
case 1:{
nums[store] = nums[front];
store++;
break;
}
default:{
nums[store] = nums[store + 1] = nums[front];
store += 2;
break;
}
}
front = tail;
}
return store;
}
};