二分查找
1.二分查找前提
(1)有序数组
(2)数组中无重复元素
2.二分查找两种写法
二分法,关键在于区间的定义,即目标值target在左闭右闭区间[left,right],还是在左闭右开区间[left,right)
第一种 — 左闭右闭区间[left,right]
左闭右闭区间就会导致下面三个细节的写法:
(1)while(left<=right)
(2)right = mid - 1
(3)初始化 right = len(nums)-1
(1)原因:因为我们定义target在[left,right]之间,包括在索引在left和right时,所以当left==right时,我们还需要做一次判断,看看target在不在它们之间
(2)原因:以数组升序为例,因为判断nums[mid_第一次]>target时已经判断过索引为mid的情况了,假如我们更新right=mid_第一次,那么第二次循环判断时的条件就变成了target在[left,mid_第一次],这个条件就不成立了,因为我们已经知道了nums[mid_第二次]>target了
代码如下:(以升序为例)
def search(nums,target):
left,right = 0,len(nums)-1
while(left<=right):
mid = int(left + (right - left) // 2)
if nums[mid]>target:
right = mid - 1
elif nums[mid]<target:
left = mid + 1
else:
return mid
return -1 # 表示target不在nums中
第二种 — 左闭右开区间[left,right)
左闭右闭区间就会导致下面三个细节的写法:
(1)while(left<right)
(2)right = mid
(3)初始化 right = len(nums)
有了上面的推导,这个也可以以此来推理
代码如下:
def search(nums,target):
left, right = 0, len(nums)
while(left<right):
mid = int(left + (right-left) // 2)
if nums[mid]>target:
right = mid
elif nums[mid]<target:
left = mid + 1
else:
return mid
return -1
3.总结
python语法
-
index的用法
使用index()获取列表中指定值的索引例如:nums.index(target)
-
//和/的区别
//:表示整型除法
/:表示浮点型除法
算法
二分查找要点:
- 定义target所在的区间是左闭右闭,还是左闭右开
- 三个细节:while循环判断条件 、right值的初始化 、 right值的更新
4.相关题目推荐
35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根
367.有效的完全平方数