二分法看起来很简单,但是要注意很多边界问题,一不留神,代码就会报错
1.二分查找,找到了返回位置,没找到返回-1
def binary_search(nums, target) :
low = 0
high = length = len(nums)-1
while 0<=low <= high<= length: #防止溢出
mid = low + (high-low)//2 #地板除法,防止溢出
if nums[mid] == target :
return mid
#左半边
elif nums[mid] > target :
high = mid -1 #一定要 +-1防止死循环
#右半边
else :
low = mid + 1
#未找到返回-1
return -1
2.leetcode 35
寻找有序数组中的位置或者插入位置
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
begin = 0
end = len(nums)
if(nums[0]>target):
return 0
if(nums[-1]<target):
return len(nums)
while begin <= end:
mid = begin + (end - begin) // 2
if nums[mid] > target:
end = mid -1
elif nums[mid] < target:
begin = mid + 1
else:
return mid
return begin
3.69. Sqrt(x)
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
start = begin = 0
stop = end = x // 2 + 1
while (start <= begin <= end <= stop):
mid = begin + (end - begin) // 2
if (mid * mid <= x < (mid + 1) * (mid + 1)):
return mid
elif (mid - 1) * (mid - 1) < x < mid * mid:
return mid - 1
elif (mid * mid > x):
end = mid - 1
else:
begin = mid + 1