当前位置:   article > 正文

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

leetcode移除有序数组中重复的两次以上的数字

前言

每日一题,开心每一天。

一、题链接

二、题意

给你一个有序数组 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

四、题解思路

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

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

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

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

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

也一样。

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50652
推荐阅读
相关标签
  

闽ICP备14008679号