题目内容:
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.
这个题目和刚刚那个题目很相似,它的区别在于它允许元素至多出现两次。
自己写的代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int flag = 1;
int size = nums.size();
if(size <= 0) //注意,其实这里可以改成size <= 2,看了答案得到的启发
return 0;
int j = 0;
int total_size = 1;
for(int i = 1;i < size; i++)
{
if(nums[j] != nums[i])
{
nums[++j] = nums[i];
flag = 1;
total_size++;
}
else if(flag == 1)
{
flag++;
nums[++j] = nums[i];
total_size++;
}
}
return total_size;
}
};
看了题目点评,觉得针对于有序的数组,使用一个标志flag就可以记录元素的出现次数了。对于无序的数组,则需要使用一个hashmap来存储其出现的次数。
答案中的代码更为简洁明了,其中还有更通用的办法。如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int size = nums.size();
if(size <= 2)
return size;
int index = 2;
int i = 2;
for(;i < size;i++)
{
if(nums[index - 2] != nums[i])
{
nums[index++] = nums[i];
}
else
continue;
}
return index;
}
};
这个方法,如果出现最多允许几次,就把2改成几就好了。