【学习记录】leetcode 26.删除有序数组中的重复项 python3

题目:

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

首先先读题,这是一个非严格递增排列的数组,数组已经排过序了不需要我们自己再sort一遍

原地删除重复的元素:也就是意味着要在原有数组上进行改动而不是创建一个新数组,而删除元素我们可以用快慢指针法降低时间复杂度同时快慢指针法也保持了元素的相对顺序保持一致,相比于删除特定元素,我们这道题要多走一步,即找出重复的元素

返回唯一元素的数量为k:由于数组最后只剩下唯一元素,所以k也是数组的大小,在快慢指针法中slow的大小也是数组最后一个元素的下标,数组大小=slow+1,也就是说最后我们返回slow+1即可

要应用快慢指针法,我们先弄清楚我们的快慢指针法要做什么工作:

快指针:找到与慢指针指向的元素不相同的元素,也即新数组的元素

慢指针:指向要更新的元素的数组下标,方便我们更新数组

接下来第一步:赋初始值,找到遍历范围

slow从0开始

fast要遍历的范围:从0~len(nums)-1,之所以是0~len(nums)-1原因是数组的下标是从从0~len(nums)-1,由于range()左闭右开的性质,循环可以写作

                                                         for fast in range(0, len(nums)):

第二步,明确循环体内的内容

我们先前说过快指针的目的,是要找到与慢指针指向的元素不相同的元素,也即新数组的元素,那么这一句话可以写作if条件语句,就是

                                                          if nums[slow] != nums[fast]:

此时fast找到在slow后第一个与slow不相同的元素的下标

接下来慢指针要指向我们要更新的元素的下标,因为我们要让每个元素仅出现一次,所以我们要更新的元素是当前slow指向的后一个元素(保留当前的slow元素)

                                                                        slow += 1

然后更新元素

                                                                nums[slow] = nums[fast]

特殊情况,slow指向的元素本身就只有一个,slow+=1后slow=fast

nums[slow]=nums[fast]后该元素并未改变,不影响结果

遍历完成后,slow是更新数组中最后一个元素的下标,数组大小等于slow+1,返回slow+1即可

                                                                return slow + 1

  • python3代码:
  • def removeDuplicates(self, nums: List[int]) -> int:

            slow=0

            for fast in range(0, len(nums)):

                if nums[slow] != nums[fast]:

                    slow += 1

                    nums[slow] = nums[fast]

            return slow + 1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值