第1天 二分查找
有序数组的遍历可解决的方法都可以考虑二分查找。
这里的有序不仅是指数值的大小,广义的指顺序对值有影响。
例如:278第一个错误的版本题目就是FFFFTT,一旦有一个T后面全是T也是一种顺序。
在数组中find一个值,找到插入的位置,找到x的平方根都可以用二分查找。
704.二分查找
一个经典的二分查找:(所有的遍历查找均可考虑此法)
left right mid 各自的初值 及恒更新条件与方式
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0 #初值
right = len(nums)-1 #初值
while(left<=right):
mid = left + (right - left)//2 #mid的更新
if nums[mid] == target: #mid return的条件
return mid
elif nums[mid] < target: #left 更新的条件
left = mid + 1
else: #right 更新的条件
right = mid - 1
return -1
278.第一个错误的版本
二分查找,需根据当下的值和后一个的值判断更新left还是right
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return a bool
# def isBadVersion(version):
class Solution(object):
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
left = 1
right = n
while left <= right:
mid = left + (right - left) // 2
now = isBadVersion(mid)
last = isBadVersion(mid-1)
if now == True and last == False:
return mid
elif now == False:
left = mid + 1
else:
right = mid - 1
35.搜索插入位置
在二分查找的基础上,加上找不到时的插入操作,要么插在最左端要么最右端。
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 - left)//2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
if target > nums[right]:
return right + 1
else:
return left