二分法查找
主要受到labuladong的启发,所以相当于是一种python实现
二分查找,其实不是分的数组,而是改变的搜索坐标。
def binary(self, target, nums):
# 二分查找,模板
right = len(nums)-1
left = 0
while left<=right:
mid = left + (right-left)//2
if target == nums[mid]:
....
elif target<nums[mid]:
.....
elif target>nums[mid]:
.....
return #....
模板如上,主要细节:
- 左右边界初始是
0
和len(n)-1
mid = left+(right-left)//2
while
条件left<=right
- 三个判断,每次调整
left
或者right
都是不包括mid
的
常见的三类二分问题:
- 找到就返回
- 寻找右边界
- 寻找左边界
**注意:**需要考虑两种特殊情况
- 不存在该数字,如[4,6]查找5
- 超出边界也没找到,判断
left == len(nums)
orright < 0
def binary_search(self, target, nums):
# 二分查找,找到元素返回索引,否则返回-1
right = len(nums)-1
left = 0
while left<=right:
mid = left + (right-left)//2 # 其实与(left+right)//2一样
if target == nums[mid]:
return mid
elif target<nums[mid]:
right = mid-1
elif target>nums[mid]:
left = mid+1
return -