零、⼆分查找框架
def binarySearch(self, nums,target):left = 0right = ... # 注意while ...:mid = (left + (right - left)) // 2if nums[mid] > target:...elif nums[mid] < target:...elif nums[mid] == target:...return ...
⼀、寻找⼀个数(基本的⼆分搜索)
⼆、寻找左侧边界的⼆分搜索
三、寻找右侧边界的⼆分查找
四、逻辑统⼀
练习题目
剑指 Offer 11. 旋转数组的最小数字



class Solution:def minArray(self, numbers: [int]) -> int:i, j = 0, len(numbers) - 1while i < j:m = (i + j) // 2if numbers[m] > numbers[j]: i = m + 1elif numbers[m] < numbers[j]: j = melse: j -= 1return numbers[i]
实际上,当出现 nums[m] = nums[j]nums[m]=nums[j] 时,一定有区间 [i, m]内所有元素相等 或 区间 [m,j] 内所有元素相等(或两者皆满足)。对于寻找此类数组的最小值问题,可直接放弃二分查找,而使用线性查找替代。
class Solution:def minArray(self, numbers: [int]) -> int:i, j = 0, len(numbers) - 1while i < j:m = (i + j) // 2if numbers[m] > numbers[j]: i = m + 1elif numbers[m] < numbers[j]: j = melse: return min(numbers[i:j])return numbers[i]




























