Leetcode Remove Duplicates from Sorted Array I and II

题意是这样的,给你一个排好序的数组,要求生成一个新数组,里面的元素出现的次数不能大于N,如N=1,那么要求数组无重复元素,N=2,要求数组中一个元素最多出现2次,这两种情况对应题目版本 I 和 II,注意不能生成新数组,空间复杂度为O(1),改变后的数组的前半部分符合题意即可,如:

N = 1, 11223 ---->  12312

N= 2, 1112223 -----> 1122323

下面是时间复杂度O(n),空间复杂度O(1)的算法,算法思想是:

设可能含有重复数字的原数组为old,“去重”后的数组为new。我们要做的是:

1. 从old中取出元素放入new中。

2. 每次放入元素的时候检查是否符合去重条件?由于原数组有序,那么old数组中重复的元素一定出现在待检查的元素前面或后面,由于我们是从前向后选择元素放,那么只需检查前面是否有重复即可,所以当N=1,数组中不允许有重复元素时,那么检查new数组最后一个元素是否和当前元素相同,相同就放弃,不同放入元素组即可.

那么N= 2呢?只需检查倒数第二个元素是否和待放入相同即可,所以只需检查倒数第N个数,就能解决任意N的问题了,因为如果倒数第2个都相同了,数组又是排好序的,那么倒数第1个肯定也是相同的。

3. 具体实现只需维护两个指针,在数组中就是下标,符合条件就复制,不符合就跳过即可。代码如下(以N=2为例):

class Solution
{
public:
    int removeDuplicates(vector<int>& nums)
    {
        int ll = nums.size();
        if(ll <= 2)return ll;
        int index = 2;
        for(int i = 2;i < ll; ++i)
        {
            if(nums[i] != nums[index - 2])
            {
                nums[index++] = nums[i];
            }
        }
        return index;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值