给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。
普通的二分查找前提:
- 数组是有序的;
- 数组中不存在重复值;
此题中不一定满足第二条;
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
前提:数组的有序的
先利用简单的二分查找,找到等于target的index,然后向左迁移找到
第一个出现target的low,然后mid恢复原值,向右迁移找到最后一个出现
target的high
def searchRange(nums, target: int):
n_l=len(nums)
low,high=0,n_l-1;
默认为没找到
start,end=-1,-1;
while low<=high:
等价于 mid= int((low+high)/2)
mid=low+high>>1;
if nums[mid]==target:
向左迁移
while mid>=low and nums[mid]==target:
mid-=1;
start=mid+1;
mid恢复中间值
mid=low+high>>1;
向右迁移
while mid<=high and nums[mid]==target:
mid+=1;
end=mid-1;
break;
elif nums[mid]>target:high=mid-1;
else:low=mid+1;
return [start,end]