题目描述
分析
通过二分,查找数组 nums 中的两个 index
第一个等于 target 的 index,第一个大于 target 的 index
算法
二分
过程
通过二分查找来找上述的两个 index
在二分中:
如果在循环中 mid 对应的值大于等于 target,可以得到第一个 index
大于则可以得到第二个 index
因此可以通过一个变量来让二分查找的代码完成两个查找任务
代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function(nums, target) {
const l = binarySearch(nums, target, true)
const r = binarySearch(nums, target, false) - 1
if (nums[l] !== target && nums[r] !== target) return [-1, -1]
return [l, r]
};
function binarySearch(arr, target, lower) {
let l = 0, r = arr.length - 1, ans = arr.length
while (l <= r) {
const mid = l + ((r - l) >> 1)
if (arr[mid] > target || lower && arr[mid] >= target) {
ans = mid
r = mid - 1
} else {
l = mid + 1
}
}
return ans
}