c++|力扣|从排序数组中删除重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。

思路: 一开始考了vector erase的方法。但是自己想多了。利用双指针法,一个指向原始数组的下标,另一个指向新数组的下标,与常规不同的是两个数组占据同一片内存空间。一开始考虑,如果相等的时候把后面的一一覆盖过来,但看了别人博客后,可以考虑两数不等时,将新数挪到已经更改后的数字的后面。设两个指针Orilen和Newlen,同时Newlen指向新的下标,遍历原始数组就用i,i从1开始,就像这样: 原始: 0,0,1,1,2,3 初始 i=1: 指针i=1,Newlen=0,两者相等,不做任何操作。 i++ i=2: 指针i=2,Newlen=0,两者不等,将Newlen++,把nums[i]赋给nums[Newlen]此时nums数组是:0,1,1,1,2,3。i指向第二个1,而后继续。 i++ i=3: i= 3,Newlen=1,两者相等,不做任何操作。 以此类推。思路还是比较巧的。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int Orilen; 
        int Newlen;
        Orilen = nums.size();
        if(Orilen == 0) {
            return 0;
        }
        Newlen = 0;
        for(int i = 1; i < Orilen ; i++){
            if(nums[Newlen] != nums[i]){
                Newlen++;
                nums[Newlen] = nums[i]; 
            }
        }
        return Newlen+1;
    }
};
经验分享 程序员 微信小程序 职场和发展