class Solution:
def search(self, nums: List[int], target:int)->int:
low, high =0,len(nums)-1while low <= high:
mid =(high - low)// 2 + low
num = nums[mid]if num == target:return mid
elif num > target:
high = mid -1else:
low = mid +1return-1
搜索插入位置
class Solution:
def searchInsert(self, nums: List[int], target:int)->int:
position =0
# 初始位置为0while True:
try:if nums[position]< target:
position +=1
# 如果该位置的数字小于target,则初始位置+1else:break
# 当该位置的数字大于等于target时,退出循环(此情况是后面还有元素)
except:break
# 当后面没有元素时,nums[position+1]会引起index out of range,用这个跳出
return position
猜数字大小
class Solution:
def guessNumber(self, n:int)->int:
left, right =1, n
while left < right:
mid =(left + right)// 2ifguess(mid)<=0:
right = mid # 答案在区间 [left, mid] 中
else:
left = mid +1 # 答案在区间 [mid+1, right] 中
# 此时有 left == right,区间缩为一个点,即为答案
return left
Sqrt(x)
class Solution:
def mySqrt(self, x:int)->int:
l, r, ans =0, x,-1while l <= r:
mid =(l + r)// 2if mid * mid <= x:
ans = mid
l = mid +1else:
r = mid -1return ans
两数之和 II - 输入有序数组
# 利用数组的有序性质,可以通过二分查找的方法寻找第二个数。为了避免重复寻找,在寻找第二个数时,只在第一个数的右侧寻找。
class Solution:
def twoSum(self, numbers: List[int], target:int)-> List[int]:
n =len(numbers)for i in range(n):
low, high = i +1, n -1while low <= high:
mid =(low + high)// 2if numbers[mid]== target - numbers[i]:return[i +1, mid +1]
elif numbers[mid]> target - numbers[i]:
high = mid -1else:
low = mid +1return[-1,-1]
在 D 天内送达包裹的能力
class Solution:
def shipWithinDays(self, weights: List[int], days:int)->int:
# 确定二分查找左右边界
left, right =max(weights),sum(weights)while left < right:
mid =(left + right)// 2#need为需要运送的天数#cur为当前这一天已经运送的包裹重量之和
need, cur =1,0for weight in weights:if cur + weight > mid:
need +=1
cur =0
cur += weight
if need <= days:
right = mid
else:
left = mid +1return left
第一个错误的版本
#The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
#defisBadVersion(version):
class Solution:
def firstBadVersion(self, n):"""
:type n:int:rtype:int"""
if n <=(2**31-1) and n >=1:
low =0
high = n -1while low <= high:
mid =(high-low)//2 + lowifisBadVersion(mid +1):
high = mid
if low == high:return low +1else:
low = mid +1if low == high:return low+1
搜索旋转排序数组
class Solution:
def search(self, nums: List[int], target:int)->int:if not nums:return-1
l, r =0,len(nums)-1while l <= r:
mid =(l + r)// 2if nums[mid]== target:return mid
if nums[0]<= nums[mid]:if nums[0]<= target < nums[mid]:
r = mid -1else:
l = mid +1else:if nums[mid]< target <= nums[len(nums)-1]:
l = mid +1else:
r = mid -1return-1
寻找旋转排序数组中的最小值
class Solution:
def findMin(self, nums: List[int])->int:
low, high =0,len(nums)-1while low < high:
pivot = low +(high - low)// 2if nums[pivot]< nums[high]:
high = pivot
else:
low = pivot +1return nums[low]