方法一:二分查找
直观的思路肯定是从前往后遍历一遍。用两个变量记录第一次和最后一次遇见
target
target 的下标,但这个方法的时间复杂度为
O
(
n
)
O(n),没有利用到数组升序排列的条件。
由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程。
考虑
target
target 开始和结束位置,其实我们要找的就是数组中「第一个等于
target
target 的位置」(记为
leftIdx
leftIdx)和「第一个大于
target
target 的位置减一」(记为
rightIdx
rightIdx)。
二分查找中,寻找
leftIdx
leftIdx 即为在数组中寻找第一个大于等于
target
target 的下标,寻找
rightIdx
rightIdx 即为在数组中寻找第一个大于
target
target 的下标,然后将下标减一。两者的判断条件不同,为了代码的复用,我们定义 binarySearch(nums, target, lower) 表示在
nums
nums 数组中二分查找
target
target 的位置,如果
lower
lower 为
t
r
u
e
true,则查找第一个大于等于
target
target 的下标,否则查找第一个大于
target
target 的下标