自学内容网 自学内容网

力扣26题-删除有序数组中的重复项

题目

        给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

自己的解法:

int removeDuplicates(vector<int>& nums) {
        int end=0,p=1;
        while(p<nums.size())
        {
            if(nums[end]==nums[p])
                p++;
            else
                nums[++end]=nums[p];
        }
        int invalidNums=nums.size()-end-1;
        while(invalidNums)
        {
            nums.pop_back();
            invalidNums--;
        }
        return (end+1);
}

        我自己的解法其实和B站大佬的解法思想是一样的,都是双指针。但是我写出来的程序繁杂冗长,随后借鉴了大佬的双指针解法如下:

int removeDuplicates(vector<int>& nums) {
        int k=1;
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]!=nums[i-1])
                nums[k++]=nums[i];
        }
        return k;
}

学习随想:

        1.这种整型的数组指针其中一个可以用 for 循环中的循环变量代替,以减少代码量,如大佬用循环变量 i 来代替了快指针。

        2.再者,是不是一般都会用循环变量来固定代替快指针呢?我的猜想是可能循环变量i++的属性完美地表达了快指针作为工作指针一直向后遍历的属性。实际是这样吗,还需通过刷题来用实践形成理论。

        3.题目会自己将前k个数组元素维护为新的数组,所以可以省略掉我自己解中第二个while循环,达到更简洁的应试代码。


原文地址:https://blog.csdn.net/weixin_64084604/article/details/145126804

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!