数组-二分查找
当给定的数组是有序的,且元素是不重复的可以使用二分查找
一、leetcode题目-704. 二分查找
给定一个
n
个元素有序的(升序)整型数组nums
和一个目标值target
,写一个函数搜索nums
中的target
,如果目标值存在返回下标,否则返回-1
。
- 方式一,区间左闭合右闭 [left,right]
class Solution:
def search(self, nums: list[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 下标从0开始,右区间闭,所以要减1
while left <= right: # 在闭区间,left=right 表示区间存在一个值
mid = (left + right) // 2 # 这里整除
if nums[mid] > target: # 目标值在左区间
right = mid - 1
elif nums[mid] < target: # 目标值在右区间
left = mid + 1
else:
return mid
return -1
- 方式二,区别左闭,右开 [left, right)
class Solution:
def search(self, nums: list[int], target: int) -> int:
left, right = 0, len(nums) # 下标从0开始,右区间开,下标值直接记录为长度
while left < right: # 右区间开,left=right没有意义,此时区间内已经没有值了
mid = (left + right) // 2 # 这里整除
if nums[mid] > target: # 目标值在左区间,右区间是开,这里不减1
right = mid
elif nums[mid] < target: # 目标值在右区间
left = mid + 1
else:
return mid
return -1
二、总结分析
二分查找只适合有序的数组,其中关键点是定义好区间,区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。