【LeetCode】26. 删除有序数组中的重复项

153 阅读2分钟

image.png

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    从上述题目要求中,我们可以提取出如下几点信息:

    • 不能改变数组的长度: 意味着不能使用remove、pop方法删除元素
    • 不能使用额外空间:潜台词不能借助新建tmp等临时数组变量
    • 输入的数组是升序排列的

二、思路分析:

从题目的要求得出,我们需要在原数组中完成删除的重复项,那么最直接的方法就是使用双指针

  • 什么是双指针?

    双指针,顾名思义是使用两个指针,遍历列表进行取值计算。

    通常双指针位置有三个场景:

    场景一:双指针同一个起点开开始

    image.png

    场景二:双指针错位开始

    image.png

    场景三:双指针一头一尾

    image.png

按照本题的要求,我们可以使用双指针在列表取值遍历。

  • 在python中,我们直接定义两个变量fast和slow。
  • 考虑到列表越界,fast和slow为1
  • 当 List[fast] 与 List[fast-1]两个值相等时,fast➕1
  • 当 List[fast] 与 List[fast-1] 不相等时,List[slow] 被赋值成 List[fast],且slow+1,fast+1

我们以List=[1,2,3,3,3,4] 这个列表来为示例,画图顺序为如下过程:

  • 初始化列表

    image.png

  • 第一次比较,1与2不相等,slow和fast都➕1

    image.png

  • 第二次比较,2与3也不相等,则List[slow] 被List[fast]赋值, slow与fast都➕1

    image.png

  • 第三次比较,3与3相等,则只需要fast+1

    image.png

  • 第四次比较,3与4不相等,则List[slow]=3 被List[fast]=4 赋值,slow与fast都➕1

    image.png

  • 第五次比较,fast+1 大于列表长度,则遍历结束

    image.png

三、实现代码:

根据上述,画图推理思路,我们用代码进行实现,如下:

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        fast=slow = 1

        while fast < len(nums):

            if nums[fast] != nums[fast-1]:
                
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        
        return slow

image.png

四、总结:

本次题主要考察的是使用双指针对列表中的元素进行删除处理,这样的用法使用可以达到时间复杂度O(n)和空间复杂度O(1)的题目要求。