C++删除数组中的重复数字(双指针)---原地删除并输出数组

在这里插入图片描述
C++删除数组中的重复数字(双指针)---原地删除并输出数组_第1张图片
说明:返回值表示了输出位置,也就是输出原数组的长度,以此实现原地删除元素并输出数组
对于这种题,使用双指针会方便很多:
看思路:

注:里边的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;
    }
};

你可能感兴趣的:(数据结构,C++,c++,双指针,原地删除,数据结构)