今天也是任题摆布的一天
题目搬运者
给定一个整数数组nums按非递减顺序排序,找到给定目标值的开始和结束位置。
如果在数组中没有找到target,则返回[-1,-1]。
你必须写一个运行时复杂度为O(log n)的算法。
思路 二分查找
- 先找到最左边target的目标位置tarleft
如果tarleft都找不到 就可立即返回 - 再用更新
# 找tarright的
left = tarleft
right = len(nums) - 1
找tarright的时候 从上一个tarleft 和n-1的位置开始查找,无需再从头查找
为什么两个二分mid取值不同?
对于第二个模板,
当我们更新区间时,如果左边界left 更新为left =mid,此时mid的取值就应为mid=(l+r+1)/2。因为当右边界right=left+1 时,此时mid=(left+left+1)/2 向下取整,mid 仍为left,左边界再次更新为left=mid,相当于没有变化,while循环就会陷入死循环。
因此,我们总结出来一个小技巧,当左边界要更新为left=mid时,我们就令 mid=(left+right+1)/2,上取整&#x