I
解题思路
- 分析:固定两个指针,一个为慢指针,一个为快指针。
- 快指针: 用来扫描整个数组
- 慢指针:用来固定当前的位置
- 算法:
当
nums[sp]==nums[fp]说明有重复情况,那么在区间
(sp,fp)范围内的数应该舍去,只需让
fp++即可
当
nums[sp]!=nums[fp]说明两数没有重复,此时我们需要让这个数保存在数组里,只要让
nums[++sp]=nums[fp]即可
- 边界:当数据只有0,1时直接返回即可。
- 结束条件: 返回
sp+1即可
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
int sp=0;
for(int fp=1;fp<nums.size();fp++)
if(nums[sp]!=nums[fp]) nums[++sp]=nums[fp];
return sp+1;
}
};
II
双指针
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=2) return nums.size();
int sp=1;
for(int fp=2;fp<nums.size();fp++)
if(nums[sp-1]!=nums[fp]) nums[++sp]=nums[fp];
return sp+1;
}
};
STL code
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
map<int,int> m;
for(int i=0;i<nums.size();i++){
if(m[nums[i]]==0) {
m[nums[i]]=1;
}else if(m[nums[i]]==1){
m[nums[i]]=2;
}else{
nums.erase(nums.begin()+i);
i--;
}
}
return nums.size();
}
};