算法思路:
二分法查找也叫折半查找,对半的处理数据提高对目标数据查找的数据
1、设置两个指针,一个指向开始开始 left = 0,一个指向末尾 right = 长度 - 1
2、然后用目标值(target)与中间值(mid)进行比较,看目标值出现在哪一个区间
3、如果目标值在左边,则 right = mid -1;如果目标值在右边,则 left = mid + 1
4、最后根据题,得出想要的是 left 还是 right 或者 mid 所对应位置
时间复杂度和空间复杂度:
时间复杂度:O(log n),其中n为数组的长度。二分查找所需的时间复杂度为O(logn)。
空间复杂度:O(1)O(1)。我们只需要常数空间存放若干变量。
举例(LeetCode35):
题目:
解法:
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0 # 设置两个指针,一个指向初始,一个指向末尾
right = len(nums) - 1
while(left <= right): # 当左指针在右指针右边时,结束循环
mid = (left + right) / 2 # 取中间值
# 该句可以等价于 mid = (left + right) >> 1 (带符号逻辑右移一位,相当于除以2)
# 对上句进行优化 mid = (right - left)/2 + left 当right和left都很大的时候,该方法可以避免整型溢出
if nums[left] == target: # 有大于、等于小于、三种情况,等于时相当于找到了直接返回
return left
if (nums[mid] < target): # 目标值比中间值大,左指针右移
left = mid + 1
else:
right = mid - 1 # 目标值比中间值小,右指针左移
return left
一篇很好的文章(遇到回来再看看):
写对二分查找不是套模板并往里面填空,需要仔细分析题意 - 搜索插入位置 - 力扣(LeetCode)
二分查找的模板文章: