Leetcode-双指针-26. 删除有序数组中的重复项/80. 删除有序数组中的重复项 II

本文介绍了如何使用双指针技术解决两道相似的编程题:删除有序数组中的重复项II和删除有序数组中的重复项。在代码实现中,通过维护一个慢指针slow和快指针fast,确保在有序数组中只保留最多两个相同的数字,并返回新数组的长度。这两种方法都避免了额外的空间复杂度,提高了效率。
摘要由CSDN通过智能技术生成

题目80. 删除有序数组中的重复项 II

题解:

双指针,l表示当前真实填充位置, r表示目前探测位置

代码:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        //cur为目前l所在位置的数值,count为计数
        int l = 0, r = 0, cur = 10001, count = 0, n = nums.size();
        if(n<=2){return n;}
        while(r < n)
        {
            //把探测位置赋值给真实位置
            nums[l] = nums[r];
            //当真实数值等于cur,计数+1
            if(cur == nums[l])
            {
                count++;
                 //当cur得计数大于2
                if(count > 2)
                { 
                    //找到下一个不等于该数的位置
                    while(r < n  &&  nums[r]==cur )
                    {
                        r++;
                    }
                    //如果直接到了末尾,直接返回当前l
                    if(r == n){return l;}
                    //否则cur更新为探测数字
                    cur = nums[r];
                    count = 0 ;
                }
                //计数小于2,l和r都+1
                else
                {
                  l++;r++;
                }
            }
            //如果真实数值不等于cur,更新cur
            else
            {
                cur = nums[l];
                count = 0;
            }
            
        }
        //返回目前真实数值位置,此为真实长度+1得位置
        return l;

    }
};

或者

80.gif

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) { // 特殊判断,如果nums长度小于2,直接输出长度n即可
            return n;
        }
        int slow = 2, fast = 2; // 因为上面已经做过特殊判别,所以这里快慢指针从2开始
        while (fast < n) {
            if (nums[slow - 2] != nums[fast]) { 
            // 因为题目要求最多两个数相同,所以这么判断
            // 如果nums[slow - 2] == nums[fast],代表已经有两个数相等,
            // 此时nums[fast]对应的数值不能放进结果之中。
            //反之,如果nums[slow - 2] != nums[fast],
            // 那么nums[fast]可以放进nums[slow]中,并且slow++,记录结果的长度。
                nums[slow] = nums[fast]; 
                slow++;
            }
            fast++; // 不管怎么样,快指针都是要向前遍历各个元素的
        }
        return slow; // 返回结果的长度,即slow
    }
};

题目26. 删除有序数组中的重复项

题解:

同上

代码:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int l = 1, r = 1, n = nums.size();
        if(n<2){return n;}
        while(r<n)
        {
            if(nums[l-1] != nums[r])
            {
                  nums[l] = nums[r];
                  l++;
            }
            r++;
        }
        return l;   

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值