1.青铜挑战——逢试必考的二分查找
分治法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
这个技巧是很多高效算法的基础,如二分搜索,排序算法(快速排序,归并排序)等等
二分查找就是将中间结果与目标进行比较,因此二分查找可以说是子最典型的分治了。
2.二分查找与分治
2.1 循环的方式
常见的使用循环的方式来实现二分查找
def binarySearch(array, low, high, target):
while low <= high:
mid = (low + high) / 2
if array[mid] == target:
return mid
if array[mid] > target:
high = mid - 1
else:
low = mid + 1
return -1
2.2 递归的方式
def binarySearch2(array, low, high, target):
if low <= high:
mid = low + ((high - low) >> 1)
if array[mid] == target:
return mid
elif array[mid] > target:
return binarySearch2(array, low, mid - 1, target)
else:
reutrn binarySearch2(array, mid + 1, high, target)
return -1
3.元素中有重复的二分查找
元素存在重复,如果重复则找左侧第一个
这里的关键是找到目标结果之后不是返回而是继续向左侧移动。
找到相等位置向左使用线性查找,直到找到相应的位置
def search(nums, target):
if nums is None or len(nums) == 0:
return -1
left = 0
right = len(nums)-1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
while mid != 0 and nums[mid] == target:
mid -= 1
while mid == 0 and nums[mid] == target:
return mid
return mid + 1
return -1