80. 删除有序数组中的重复项 II

给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

这个题和前面两道题[1](leetcode-27. 移除元素 | Grady’s coding notes (gr4dyzhou.github.io)),[2](leetcode-26. 删除有序数组中的重复项 | Grady’s coding notes (gr4dyzhou.github.io))都属于双指针,总结出了个模板


本题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n=nums.size();
if(n<3) return n;
int s=2,f=2;
while(f<n){
if(nums[f]-nums[s-2]){
nums[s]=nums[f];
s++;
}
f++;
}
return s;
}
};

元素出现次数等于s,f的初始位置

重复项-Ⅰ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n=nums.size();
if(n<2) return n;
int s=1,f=1;
while(f<n){
if(nums[f]-nums[s-1]){
nums[s]=nums[f];
s++;
}
f++;
}
return s;
}
};

初始化s=f=1.

移除元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int s = 0;
int f = 0;
while (f < n) {
if (nums[f] != val) { //区别在这里
nums[s] = nums[f];
s++;
}
f++;
}
return s;
}
};