【每日力扣】26. 删除有序数组中的重复项

关键知识点:快慢指针

题解:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        slow, fast = 0, 1
        if len(nums) > 1:
            while fast < len(nums):
                if nums[fast] == nums[slow]:
                    fast += 1
                elif nums[fast] != nums[slow]:
                    nums[slow+1] = nums[fast]
                    slow += 1
                    fast += 1
        return slow+1

题目说明数组有序,那其实比较两个元素是否相邻即可。

如果直接对重复元素遍历进行list.pop()的操作,那循环的list下标会溢出,题目又要求要在原list中进行删除,所以也不能用一个新的列表进行结果的保存。

所以需要换个思路,即将不重复的元素移到左侧,那就是分为两种if判断情况:

1. 如果nums[slow] == nums[fast]:fast继续往后移动,直到找到不同的元素

2. 如果nums[slow] != nums[fast]:slow的下一个值设置为fast所指的不同的值,同时两个指针都往后移动一格。

另外,最开始我想了个比较笨的办法,把重复的下标存起来,遍历完了再一起删除,效率非常低:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) > 1:
            idx = []
            for i in range(1, len(nums)):
                if nums[i] == nums[i-1]:
                    idx.append(i)
            count = 0
            for i in idx:
                nums.pop(i - count)
                count += 1
            print(nums)
        return len(nums)

其实按照这个思路的话,可以倒序遍历整个list,然后原地pop,效率高了很多:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) > 1:
            for i in range(len(nums)-1, 0, -1):
                print(i)
                if nums[i] == nums[i-1]:
                    nums.pop(i)
        return len(nums)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值