80. Remove Duplicates from Sorted Array II

本文介绍了一种在数组中去除重复元素的优化算法,通过比较当前元素与前两个元素来判断是否保留,避免了传统方法可能导致的覆盖问题。提供了一种更优雅的实现方式,以及对重复元素进行保留的逻辑优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析:和上一题相似,从数组的第三个元素开始遍历,把和前一个的前一个(A[i-2])的值不同的元素保存下来,这里需要注意的是原来的A[i-2]的值可能已经被覆盖了,比如1,1,1,2,2,3遍历到第4个元素2时,需要保存,并且保存在了第三个位置数组变成了1,1,2,2,2,3,遍历到第5个元素2时,前一个的前一个元素本来是1,但是前面已经被2给覆盖了,所有我们需要保存上一次被覆盖元素的索引和值。

class Solution {
public:
    int removeDuplicates(int A[], int n) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        //只要当前元素和前一个的前一个不同就保留
        if(n == 0) {A = NULL;return 0;}
        if(n <= 2)return n;
        int index = 2;
        int lastChange, lastChangeIndex = -1; //上一次被覆盖的位置和被覆盖的值
        for(int i = 2; i < n; i++)
        {
            int prepre = A[i-2];
            if(i-2 == lastChangeIndex)prepre = lastChange;//原来的A[i-2]有可能被覆盖了
            if(A[i] != prepre)
            {
                lastChangeIndex = index;
                lastChange = A[index];
                A[index++] = A[i];
            }
        }
        return index;
    }
};

还有一种更优雅的方法是,当我们需要留下某个元素时,先暂时保存好,等到下一轮再覆盖,这样我们找前一个的前一个元素A[i-2]时,就不会出现A[i-2]原来的值被覆盖的情况。

class Solution {
public:
    int removeDuplicates(int A[], int n) {
        if(n==0)return 0;
        if(n==1)return 1;
        int num=1,i,temp=A[1];
        for(i=2;i<n;++i)
            if(A[i]!=A[i-2])
            {
                A[num++]=temp;
                temp=A[i];
            }
        A[num++]=temp;
        return num;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值