【刷题日记】26. 删除有序数组中的重复项

892 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

本次刷题日记的第 55 篇,力扣题为:26. 删除有序数组中的重复项,简单

一、题目描述:

一个简单的数组题,删除数组里面的元素,用什么方式删除会比较好呢?

二、这道题考察了什么思想?你的思路是什么?

来看看题目都给我们说了啥,题目给出的文字内容还是挺多的,我们可以大体梳理一下

  • 题目给出的是一个升序数组,里面的数字会有多个是重复的,我们需要删除这些重复的数字
  • 有一个要求,我们是不能开辟额外空间的,也就意味着我们需要在原数组上进行处理
  • 题目还有一个要求,需要我们返回删除元素之后的长度 k,且前 k 个数字都是不重复的

分析

题目要求我们不能额外开辟空间,那么这题的空间复杂度注定是 O(1)

根据题目中的另外 2 个要求,我们知道必须要在原数组上操作,且肯定是要做赋值操作,可以理解为,将重复的数字向数组尾巴后面放

当然也是可以将重复逇数组将数组头部后面插入,我理解的是哪种方式都是可以的

只要我们能够找到前 k 个数字是不重复的,且返回 k 的数值就可以了

简单模拟一下:

如何将案例中的数字,经过某种变换后调整成上图中第二排的结果呢?此处我们不需要关心 数字 4 后面具体元素的数据是多少,这是没有意义的,我们需要关注重点

就目前咱们需要的这个效果来看,我们应该是需要一个快指针来遍历数组,一个慢指针来记录需要的结果数组的长度

当快指针遍历到自己当前指针的数字和前一个数字不一样的时候,那么慢指针就要被赋值成当前快指针的数字,然后向后移动一步,知道快指针将数组遍历完毕后,返回慢指针的指向即可

上述的这种方式,其实就是双指针的解法,咱们按照思路来实现一下吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

此处需要注意的是,咱们可以直接定义慢指针 slow pointer 为 1 ,当题目给出的数组不为空的时候,结果数组的长度必然是大于等于 1 的

编码如下:

func removeDuplicates(nums []int) int {
    n := len(nums)

    if n == 0 {
        return 0
    }

    sp := 1

    for fp := 1; fp < n; fp++ {
        if nums[fp] != nums[fp-1] {
            nums[sp] = nums[fp]
            sp++
        }
    }
    return sp
}

四、总结:

就目前来看,分析过程中明确知道基本题解法的空间复杂度一定是 O(1) ,此处就不过多解释了,

时间复杂度是 O(n) ,因为咱们的快指针遍历了一遍数组

原题地址:26. 删除有序数组中的重复项

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~