说明:返回值表示了输出位置,也就是输出原数组的长度,以此实现原地删除元素并输出数组。
对于这种题,使用双指针会方便很多:
看思路:
注:里边的slow=output,fast=inspect
1.首先如果数组长度<=2,那么没有必要去检索,一定满足条件直接返回就行。
2.如果数组长度>2,那么设立两个指针,一个inspect,负责遍历检索所有元素,一个output负责修改元素值满足删除目的,并且满足最后输出长度。
3.刚开inspect和output都=2,(原因:前两个必然不用修改)同一位置。
那么此时判断下output-2位置的元素和inpect比较是否相等?
如果相等那必然有三个相等了,需要改变第三个元素,因为此时必然nums[output−2]=nums[inpectt−1]=nums[inpect]
此时output不动,移动inpect,直到找到不一样的元素, 令nums[output]=nums[inspect],满足了删除一个元素了,output后移,把inpect元素一一都复制到前面,
当复制两个元素后如果此时还是原来那个判断条件output-2位置的元素和inpect相等,那么说明后面的元素也有重复量>=3的,output继续不动,移动inpect,直到找到不一样的元素,令nums[output]=nums[inspect]
如此把满足条件的元素都一一放在前面,最后输出ouput即为满足要求长度,因为数组从0开始,并且结尾处output会++一次,所以长度上就满足了。
看代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=2){
return nums.size();
}
int len=nums.size();
int output=2,inspect=2;
for(inspect=2;inspect<len;inspect++){
if(nums[output-2]==nums[inspect]){//发现了需要更改的位置,output不动
continue;
}
else{
nums[output]=nums[inspect];//找到了不相等的元素,把这些元素一一挪到前面输出位置
output++;
}
}
return output;
}
};