-
查左边界:=时,收缩right
-
查右边界:=时,收缩left
-
标准二分模板
- 循环条件: <=
- 左mid+1右mid-1,=时返回mid
- 返回mid或-1
left = 0
right = len(data) - 1
while left <= right:
mid = left + int((right - left) / 2)
if data[mid] == target: return mid
if data[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
- 找左右边界模板
- 左
- 循环条件: <
- 左mid+1,右mid
- 返回left或-1
- 右
- 循环条件:<
- mid = xxx +1
- 左mid,右mid-1
- 返回right或-1
## 查找左边界和右边界
def GetNumberOfK(self , data: List[int], k: int) -> int:
if not data:
return 0
# write code here
left = 0
right = len(data) - 1
while left < right:
mid = left + int((right - left) / 2)
if data[mid] < k:
left = mid + 1
elif data[mid] >= k:
right = mid
fir = left if data[left] == k else -1
if fir != -1:
if left == len(data) - 1 or data[left + 1] != k:
return 1
else:
right = len(data) - 1
while left < right:
mid = left + int((right - left) / 2) + 1
if data[mid] <= k:
left = mid
else:
right = mid - 1
return right - fir + 1
return 0