Description
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.
Solution
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size() == 0) return 0;
int j = 0;
int num = 0;
for(int i = 1; i < nums.size(); i++) {
if(nums[j] == nums[i]) {
num++;
if(num < 2) nums[++j] = nums[i];
} else {
nums[++j] = nums[i];
num = 0;
}
}
return j + 1;
}
};
Analysis
这道题类似26题的Remove Duplicates from Sorted Array,唯一不同的是数组可以允许元素重复,但是最多不超过两个。这里我们需要一个计算器num来记录元素重复的次数,当某一重复元素个数小于等于2时,遇到nums[j] = nums[i]时,j和num加1,令nums[j] = nums[i],不是重复元素的时候将num清零,以便方便下一次对元素重复个数的计算。当某一重复元素大于2的时候,遇到nums[j] = nums[i]时,类似前面,但不同的是只有num<2时才能使nums[++j] = nums[i]。这一点需要非常注意,因为对于某一重复元素个数多于2时,从重复元素的第一个开始,我们要它的下一位重复元素就行了,剩下的全部不要,即j加1,然后再来找下一个与该元素不同的元素,再执行nums[++j] = nums[i]时,根据上述思想依次进行下去直到循环结束。