数据结构Day1 704. 二分查找,27. 移除元素

因为本人自律性较差,非科班,打算重启一下CSDN写博客整理自己的想法的打算

闲话不多说

704 二分查找

这道题比较简单,但是在区间的判断上是比较有讲究的,可能一看就会,一做就错

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        #二分查找法去不断的缩小范围,复杂度是logn
        left = 0
        right = len(nums)-1
        while left <= right:
            mid = left + (right-left)//2
            if nums[mid] < target:
                left = mid+1
            elif nums[mid] > target:
                right = mid-1
            else:
                return mid
        return -1

while语句里面判断是否等于对我来说是深受其害,每次都忘了去写

注意要点是:在看了代码随想录后,发现二分查找可能会面对以下几个问题:寻找一个数、寻找左侧边界、寻找右侧边界,不等号是否应该带等号,mid 是否应该加一

参考博客:704. 二分查找 - 力扣(Leetcode)

27. 移除元素

这道题之前做过,如果是正向遍历的话,删除指定元素后,数组坐标的下标一定会发生改变,这样就会乱了套了。

方法1:倒序遍历

一个比较贱兮兮的做法是,既然正着遍历会改变数组的下标,下标是正着去数数的啊,我倒着去遍历,不就没有这回事了么。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        #倒序遍历删除
        for i in range(len(nums)-1,-1,-1):
            if nums[i] == val:
                del nums[i]
        return len(nums)

复杂度n,太巧了,可惜也太过于投机取巧了!!

方法2:快慢指针

又到了我怎么写怎么晕的过程

快慢指针的思路

        定义一下快慢指针的运动规则,快指针一直在走,慢指针只有遇到快指针遇到非目标值才走,如果有非目标值,就不停的将非目标值搬运到slow的位置处

        判断条件以快指针为主,相当于快指针是一个探索者,发现问题触发条件后让慢指针有下一步的动作

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo2vec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值