二分查找——目标值搜索(leetcode 704. 二分查找)

本次有序的无重复数组的目标值位置索引查找的问题,利用二分查找
二分查找的难点是:决策边界不好确定,分别采用1)左闭右开;2)左闭右闭
判断的核心:区间范围
左闭右开 原始的区间范围为[left, right),当判断外部循环是< 还是 <=时,考虑如下情况:
当采用<时,跳出循环的条件时left=right,因此当时的区间范围为[left, left)
当采用<=时,跳槽循环的条件是left=right+1, 因此当时的区间范围为[right+1, right) 存在数组越界

左闭右闭 原始的区间范围为[left, right],当判断外部循环是< 还是 <=时,考虑如下情况:
当采用<时,跳出循环的条件时left=right,因此当时的区间范围为[left, left],存在公共区间
当采用<=时,跳出循环的条件是left=right+1, 因此当时的区间范围为[right+1, right]

#左闭右开
def query_target(list_num, target):
left = 0
right = len(list_num)
while left < right:
mid = left + int((right-left)/2)
if list_num[mid] > target:
right = mid #right是开区间,mid以及比较完了,当right=mid也不会比较了
elif list_num[mid] < target:
left = mid + 1 #left是闭区间,mid以及比较完了,所以需要加1
else:
return mid
return -1

#左闭右闭
def query_target_2(list_num, target):
left = 0
right = len(list_num) - 1
while left <= right:
mid = left + int((right-left)/2)
if list_num[mid] > target:
right = mid - 1
elif list_num[mid] < target:
left = mid + 1
else:
return mid
return -1

"""
leetcode 704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,
如果目标值存在返回下标,否则返回 -1。

示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
"""
class Solution(object):
def search(self, nums, target):
left = 0
right = len(nums)
while left < right:
mid = left + int((right - left) / 2)
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid
else:
left = mid + 1
return -1

posted on 2021-10-28 17:02  random_boy  阅读(49)  评论(0编辑  收藏  举报

导航