代码随想录第一天 二分查找 移除元素

力扣二分查找

总体来讲属于回顾代码和思路,复习了二分查找的思路

力扣移除元素

第一想法 通过覆盖原来的元素,实现元素的删除操作。但是在如何实现代码上面出现问题。

看完代码随想录:通过设置快慢指针,将快指针指向下一个元素,并且将与给定值不同的元素移动到前一个与给定值相同的元素上面,实现了相同元素的删除操作,而后慢指针则进行加一操作,直到快指针到达数组尾部即可。

相同类型题目的框架总结:

# 删除有序数组的重复项
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        
        n = len(nums)
        fast = slow = 1 # 删除重复元素之后也至少剩下一个元素
        while fast < n:
            if nums[fast] != nums[fast - 1]: # 说明nums[fast] 和之前的元素都不同
                nums[slow] = nums[fast]      # nums[fast] 的值复制到 nums[slow]
                slow += 1
            fast += 1
        
        return slow # 从nums[0]到nums[slow−1]的每个元素都不相同
        
# 删除有序数组中的重复项II 每个元素最多出现两次
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if (n <= 2) :
            return n
        
        slow, fast = 2, 2 # 数组的前两个数必然可以被保留
        while (fast < n) :
            # 检查上上个应该被保留的元素nums[slow−2]是否和当前待检查元素nums[fast]相同
            if nums[slow - 2] != nums[fast] :
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        
        return slow # 从nums[0]到nums[slow−1]的每个元素都不相同
        
# 通解扩展
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        def solve(k): # 最多保留k位相同数字
            slow = 0 # 慢指针从0开始
            for fast in nums: # 快指针遍历整个数组
                # 检查被保留的元素nums[slow−k]是否和当前待检查元素fast相同
                if slow < k or nums[slow - k] != fast:
                    nums[slow] = fast
                    slow += 1
            return slow # 从nums[0]到nums[slow−1]的每个元素都不相同
        return solve(2)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值