Leetcode – Binary Search(二分查找)
- 二分查找基本框架
l=0
r=len(nums)-1
while l<=r:
m=l+(r-l)//2
if nums[m]==target:
return m
elif nums[m]<target:
l=m+1
else:
r=m-1
return -1
- 寻找左侧边界的二分查找
- left < right ,查找区间[left,right)
l = 0
r = len(nums)
while l<r: #搜索区间[left,right)
m = l + (r-l)//2
if nums[m]<target:
l = m+1 #搜索[m+1,right)
else:
r = m #[left,m)
return l
- left<=right,查找区间[left,right]
l = 0
r = len(nums)-1
while l<=r: #搜索区间[left,right)
m = l + (r-l)//2
if nums[m]<target: #当相等时不立即返回,而是l+1
l = m+1 #搜索[m+1,right]
else:
r = m-1 #[left,m)
if left<0 or left>=len(nums) or nums[left] != target:
return -1
return left
- 寻找右侧边界的二分查找
- left < right ,查找区间[left,right)
l = 0
r = len(nums)
while l<r: #搜索区间[left,right)
m = l + (r-l)//2
if nums[m]<=target: #当相等时不立即返回,而是l+1
l = m+1 #搜索[m+1,right]
else:
r = m #[left,m)
return l-1
- left<=right,查找区间[left,right]
l = 0
r = len(nums)-1
while l<=r: #搜索区间[left,right)
m = l + (r-l)//2
if nums[m]<=target: #当相等时不立即返回,而是l=m+1
l = m+1 #搜索[m+1,right)
else:
r = m-1 #[left,m)
if right<0 or right>=len(nums) or nums[right] != target:
return -1
return right
Leetcode 34 Find First and Last Position of Element in Sorted Array
l = 0
r = len(nums)-1
while l<=r: #搜索区间[left,right)
m = l + (r-l)//2
if nums[m]<target:
l = m+1 #搜索[m+1,right)
else:
r = m-1 #[left,m)
if l < 0 or l>=len(nums) or nums[l] != target:
return [-1,-1]
r = l+1
while r<len(nums) and nums[r] == target:
r +=1
return l,r-1