删除有序数组中的出现两个以上元素的重复项(详解)

前言

每日一题,开心每一天。

一、题链接

二、题意

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

三、题解代码

下面展示一些 内联代码片

int removeDuplicates(int* nums, int numsSize)
{
    if (numsSize <= 2) {
        return numsSize;
    }
    int slow = 2, fast = 2;
    while (fast < numsSize) 
    {
        if (nums[slow - 2] != nums[fast]) {
            nums[slow] = nums[fast];
            ++slow;
            ++fast;
        }
        else
        {
            ++fast;
        }
    }
    return slow;
}

四、题解思路

slow=2,fast=2.
一、由题意,要在原数组删除重复的数字,我们可以用两个数组下标,,慢下标nums[slow],快下标nums[fast]。
二、又因为是删除出现两次以上的数子,我们可以在弄一个nums[slow-2],比较nums[slow-2]和nums[fast]
例子:

int nums[]={1,1,1,2,2,3};

情况一:
前三个相同,所以用slow-2和slow,因为只要删除出现两个相同的数字。
slow下标指向要换的数字,用fast下标的数字赋值。
可能有人会问,为什么用slow-2而不用另外一个名字来表示开头下标呢?
因为要保证slow下标和slow-2下标相隔一个元素,这样就可以保证在slow-2下标元素和fast下标元素相同的时候,slow下标元素是要删除的。
最后要返回新数组的长度,虽然slow下标指向最后一个元素,但是其返回的数是其下标。

在这里插入图片描述
情况二:

int nums[]={1,1,2,2,2,3}

也一样。

总结

今天到这了,还有其他题解的欢迎留言,共同学习啦。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

世_生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值