defsearch(nums,target): left = 0 right = len(nums)-1# 左闭右闭区间 while left <= right: # 当left=right时,是有意义的 mid = left + (right-left)//2# 防止溢出 if nums[mid] == target: return mid if nums[mid] > target: # 此时mid处肯定不是target,所以right = mid -1 right = mid -1 else: left = mid + 1 return -1
2、左闭右开区间
1 2 3 4 5 6 7 8 9 10 11 12
defsearch(nums,target): left = 0 right = len(nums) # 左闭右开区间 while left < right: # 当left=right时,没有意义的 mid = left + (right-left)//2# 防止溢出 if nums[mid] == target: return mid if num[mid] > target: right = mid # 因为是开区间,此时right可以使mid else: left = mid + 1 return -1
3、左开右开区间
1 2 3 4 5 6 7 8 9 10 11 12
defsearch(nums,target): left = -1 right = len(nums) # 左开右开区间 while left + 1 < right: # 当left=right时,没有意义的 mid = left + (right-left)//2# 防止溢出 if nums[mid] == target: return mid if num[mid] > target: right = mid # 因为是开区间,此时right可以使mid else: left = mid return -1
classSolution: # 使用二分法找到元素 defsearch(selef, nums, target): left = 0 right = len(nums)-1# 左闭右闭区间 while left <= right: # 当left=right时,是有意义的 mid = left + (right-left)//2# 防止溢出 if nums[mid] < target: left = mid + 1# 范围缩小到[mid+1, right] else: right = mid - 1# 范围缩小到[left, mid-1] return left # 左开右开区间,right最终指向答案 defsearch2(selef, nums, target): left = -1 right = len(nums) # 左开右开区间 while left + 1 < right: # 当left=right时,没有有意义的 mid = left + (right-left)//2# 防止溢出 if nums[mid] < target: left = mid else: right = mid return right
classSolution: deffindPeakElement(self, nums: List[int]) -> int: # 峰值左边设为红色,峰值及峰值右边设为蓝色,则n-1即最后一个位置为蓝色,所以区间范围变成【0,n-2】 # 闭区间[0,n-2]转换成开区间就是[-1,n-1] l = -1 r = len(nums)-1 while l+1 < r: mid = l + (r-l)//2 if nums[mid]>nums[mid+1]: # mid右半边都是蓝色 r = mid else: # mid左半边都是红色 l = mid return r
# 法一:时间复杂度:O(logN);空间复杂度:O(1) classSolution: defsearchMatrix(self, matrix, target: int) -> bool: m, n = len(matrix), len(matrix[0]) # 从左下角元素开始进行二分 i = m-1 j = 0 # 什么时候结束,while i>=0 and j<n while i >= 0and j < n: if matrix[i][j] == target: returnTrue elif matrix[i][j] < target: j += 1 else: i -= 1 returnFalse
# 法二:时间复杂度:最坏O(MlogN);空间复杂度:O(1)
defsearch(arr, target): l = 0 r = len(arr)-1 while l <= r: mid = (l+r)//2 if arr[mid] == target: returnTrue elif arr[mid] > target: r = mid - 1 else: l = mid + 1 if l < len(arr) and arr[l] == target: returnTrue else: returnFalse
classSolution2: defsearchMatrix(self, matrix, target: int) -> bool: m, n = len(matrix), len(matrix[0]) # m = 5, n = 5 for i inrange(m): if search(matrix[i], target): returnTrue returnFalse