好久没有刷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