思路
二分查找是一种在每次比较之后将查找空间一分为二的算法。每次需要查找集合中的索引或元素时,都应该考虑二分查找。如果集合是无序的,我们可以总是在应用二分查找之前先对其进行排序。
二分查找一般由三个主要部分组成:
- 预处理 —— 如果集合未排序,则进行排序。
- 二分查找 —— 使用循环或递归在每次比较后将查找空间划分为两半。
- 后处理 ——在剩余空间中确定可行的候选者。
基本模版
def binarySearch(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) == 0:
return -1
#初始条件:left = 0, right = length-1
left, right = 0, len(nums) - 1
#终止:left > right
#向左查找:right = mid-1
#向右查找:left = mid+1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
# End Condition: left > right
return -1
求平方根
class Solution:
def mySqrt(self, x: int) -> int:
nums = range(x+1)
left,right = 0,len(nums)-1
while left <= right:
mid = (left + right) // 2
if nums[mid] * nums[mid] <= x:
n = nums[mid]
left = mid+1
else:
right = mid - 1
return n
二维数组中的查找
#暴力
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == target:
return True
return False
时间复杂度:O(m*n)
#线性查找
class Solution:
def Find(self , target: int, array: List[List[int]]) -> bool:
# 左下角开始,遇tar大右移,遇tar小上移,直到超过边界都没找到,得false。否则得true。
i = len(array) - 1
j = 0
while i>=0 and j <= len(array[0]) - 1:
if array[i][j] < target:
j += 1
elif array[i][j] > target:
i -= 1
else:
return True
return False