错误解答:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int flag[30001]={0};
int last_exchange=0;
int count=0;
int i=0;
while(last_exchange<nums.size()){
int x=nums[i];
if(flag[x]==0){//是未出现过的元素
i++;
if(last_exchange<i)last_exchange=i;
count++;
flag[x]=1;
continue;
}
else if(flag[x]==1){//出现过的元素
last_exchange++;
//swap(*nums[i],*nums[last_exchange]);
if(last_exchange>=nums.size())break;
int t=nums[i];
nums[i]=nums[last_exchange];
nums[last_exchange]=nums[i];
continue;
}
}
return count;
}
};
误区:该方法主要通过交换数字位置来完成目标,但是当nums中有负数存在时(如{-1,0,0,0,2,3}),就无法运行,因为flag数组的下标不能是负数。
正确解答:寻找未重复的数字向数组前部添加即可,因为重复的数字不可能再被添加,所以不必保留,可以直接被未重复的数字覆盖。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i=0,j=1;
int n=1;
while(j<nums.size()){
if(nums[i]==nums[j])//重复出现,向后寻找
j++;
else{
nums[++i]=nums[j];
j++;
n++;
}
}
return n;
}
};