leecode 力扣刷题 #704 二分查找 (简单)

好久没有刷leetcode了,选一题简单的试试手(^-^)V

#704:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
在这里插入图片描述
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search

在这里插入图片描述

解题思路:

一个一个找,然后发现超级无敌慢,放在最后被#起来的方法二了,没看清楚题目二分!二分!二分!还以为从list里一个一个找是常规操作。看了官方解释,自己试了一下,快好多我的妈呀!具体思路代码后面有#的备注,边看代码边看备注应该会比较好理解。简单来说就是以下规则:

1. list的头和尾分别叫left和right,对半切开叫mid。正常情况是left小于等于right,这个逻辑我们先定义清楚。
2. target在mid左边,则right=mid-1,继续对左边一半的list做砍半的动作,直到找到target。
3. target在mid右边,则left=mid+1,继续对右边一半的list做砍半的动作,直到找到target。
4. 如果2和3做到left都大于right了,说明以上逼近target的动作已经扫过了整个list,但没有扫到任何叫target的东西,它不存在,跳出回圈,直接给-1即可

写完发现我好像很啰嗦。emmm,我的脑子:简单说一下。我的手:不小心就打了4句话。

实测:

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        #方法一,二分法,确实比一个一个数来的快
        #left = 0
        #right = len(nums)-1
        left, right = 0, len(nums)-1#原来写一句真的比拆开两句写要快诶,一句是16ms,两句是28ms,差太多了吧!!!决定以后都这样写了

        while left <= right:#左边界小于等于右边界,逻辑正常
            mid = left + (right-left)/2#听说(left+right)/2会有问题,改成 2left/2 + (right-left)/2 比较好
            if nums[mid] == target:#很久没写python,差点忘记要==而不是=了
                return mid
            elif nums[mid] < target:#target在右,left往右移动一格,逐步逼近target
                left = mid + 1
            else:#target在左,right往左移动一格,逐步逼近target
                right = mid -1
        return -1#左边界大于右边界,逻辑不正常,逼近到走过头了都没有发现target,说不存在那个满足以上正常条的target,跳出回圈给-1即可
        
        #方法二:一个一个数,最慢的做法,5436ms,我的个老天鹅鹅鹅丫( ºΔº )
        #for i in range(len(nums)):
        #    if target in nums:
        #        if nums[i] == target:
        #            return i
        #    else:
        #        return -1

leecode实测截图:
在这里插入图片描述
在这里插入图片描述
太好了,可以去刷下一题了,我发现我真的是年纪越大越容易满足的一个人耶~ (▰˘◡˘▰)
希望看到这篇文章的小伙伴觉得有帮助,然后继续心情美美的一天~ d(`・∀・)b

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没意思不好玩我不玩了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值