剑指 Offer 53 - I. 在排序数组中查找数字 I
给定排序好的上升数组,找出数组中目标值出现的次数;
这种排序好的数组,找目标值在不在,出现的次数,就用二分法;
示列:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
脑海里就推一遍[5,7,7,8,8,10], targrt=8
class Solution:
def search(self, nums: List[int], target: int) -> int:
def binarySearch(isleft):
s,e = 0,len(nums)-1
res = None
while s<=e:
mid = (s+e)>>1
if nums[mid]==target:
if isleft:
res = mid if not res else min(res,mid)
e = mid-1
else:
res = mid if not res else max(res,mid)
s = mid+1
elif nums[mid]>target:
e = mid-1
else:
s = mid+1
return res
# else:
# if isleft:
# res = mid if not res else min(res,mid)
# else:
# res = mid if not res else max(res,mid)
left = binarySearch(True)
if left is None: #left 有可能返回的是0,所以不能直接用not left 代替 left is None
return 0
right = binarySearch(False)
return right-left+1
时间复杂度O(logn) 空间复杂度O(1)
将二分查找代码整合到一个方法中,传入一个flag标记当前是找左边界还是右边界,以减少代码冗余
剑指 Offer 53 - II. 0~n-1中缺失的数字
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
二分法
class Solution:
def missingNumber(self, nums: List[int]) -> int:
s,e = 0 ,len(nums)-1
while s<=e:
m = (s+e)//2
if nums[m]>m:
e = m-1
else:
s = m+1
return s
时间复杂度O(logn)空间复杂度O(1)