力扣第二十六题26.删除有序数组中的重复项

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

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 升序 排列

1.暴力双for循环,代码如下:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        int k = 1, t = nums[0];//第一个元素是无论如何都不要动的,所以拿出来单独分析,不相同元素个数也设置为1
        for(int i = 1; i < len; i++)
        {
            //从i开始遍历数组,因为数组是升序排列的。
            for(int j = i ; j < len; j++)
            {
                //数组元素比前面已排列的元素的最后一个元素大
                if(nums[j] > t){
                    nums[i] = nums[j];//将该元素添加到已排列元素的最后
                    t = nums[j];//更新比较值,即最后一个已派列元素的值
                    i++;//i始终代表已派列数组元素的最后一位加1,给新来的元素预留位置
                    k++;//已排列数组元素个数+1
                }
            }
        }
        return k;
    }
};

/*作者:CaiCode
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/2386238/yong-liang-ge-forxun-huan-gai-dong-shu-z-yf26/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

2.双指针1,代码如下:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        int l = 1, r = 1;//将快慢指针指向下标1,第一个元素无论如何不需要动
        while(l <= r && r < len)//遍历数组
        {
            if(nums[r] != nums[r - 1])//因为数组是有序数组,相等的元素一定是排列在一起的,即下标连续,故可以判断当前元素和上一元素的等价关系
            {
                nums[l++] = nums[r];//若不等于,即说明快指针找到了下一个不同元素的位置,将其归并到已排列元素(即不同元素的组合)当中,称为不同元素组合当中的最后一位,并将慢指针加1,给下一个不同元素预留位置。
            }
            r++;//无论如何快指针在每次循环后都往后推一位,因为它只是负责查找的功能。
        }
        return l;//因为l最后代表的是不同元素组合的最后一位元素的下标加1,表明不同元素的最后一位下标为l-1,而数组是从0开始计数的,所以最后不同元素共有(l-1)+ 1 = l 个。
    }
};
/*

作者:CaiCode
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/2386280/shuang-zhi-zhen-by-caicodehh-3n0s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

 双指针判断当前元素与上一元素的等价关系

 3.双指针2,代码如下:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        if(len == 0) return 0;//一个元素都没有的情况,空数组返回0
        int l = 0, r = 0,k = 1;//双指针快慢指针均指向0,元素个数设置为1
        while(l <= r && r < len - 1){
            //快指针找到下一个元素不一样了
            if(nums[r] != nums[r + 1]){
                //快慢指针相等的情况,这时候无需排列,跳过做下次循环即可
                if(l == r){
                    l++;
                    r++;
                    k++;
                    continue;
                }
                l++;//慢指针加1,给新元素留位置
                nums[l] = nums[r + 1];//替换元素值
                k++;//不相同的元素加1
            }
            r++;//无论如何,慢指针每次循环后必定加1去找
        }
        return k;
    }
};
/*
作者:CaiCode
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/2386254/shuang-zhi-zhen-jie-jue-by-caicodehh-cmdm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

 双指针判断当前元素与下一元素是否相等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HH_Love_Yourz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值