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.
题目要求去除重复的元素,每个元素最多重复2次,是比较典型的的双指针问题,第一个指针记录无重元素序列的末尾,第二个元素负责遍历整个数组。有一个问题需要注意一下,这里最多只允许重复两次,所以需要再设置一个变量count来表示重复了几次,count初始值为1,如果有元素重复则该值减一;如果没有重复则恢复为1,由于该数组为有序数组,元素递增,当前数字不重复则以后也不会有该数字的重复。
1 class Solution {
2 public:
3 int removeDuplicates(vector<int>& nums) {
4 int len = nums.size();
5 if (len <= 2)
6 return len;
7 int pre = 0, cur = 1, count = 1; // pre和cur分别表示快慢指针,count用来表示是否已经到达重复次数的限制 0表示已经重复到2次,1表示没有
8 while (cur < len)
9 {
10 if (nums[cur] == nums[pre] && count == 0)
11 cur++;
12 else
13 {
14 if (nums[cur] == nums[pre])
15 count--;
16 else
17 count = 1;
18 nums[++pre] = nums[cur++];
19 }
20 }
21 return pre + 1;
22
23 }
24 };
当然也可以写的更简洁一些,但是不太好理解,不过思路是类似的,因为是有序数组,可以通过比较大小来判断数字是否重复
1 class Solution {
2 public:
3 int removeDuplicates(vector<int>& nums) {
4 int i = 0;
5 for (auto n : nums) {
6 if (i <= 1 || n > nums[i-2]) {
7 nums[i++] = n;
8 }
9 }
10 return i;
11 }
12 };