昇順に配列された整数の配列を指定してnums
、目標値target
。アレイ内の所与の標的の開始および終了位置を特定します。
アルゴリズムのあなたの時間複雑でなければならないO(log n)
レベル。
何のターゲット配列とリターンが存在しない場合[-1, -1]
。
例1:
入力:NUMS = [5,7,7,8,8,10]、目標 = 8
出力:[3,4]
例2:
入力:NUMS = [5,7,7,8,8,10]、目標 = 6
出力:[-1、-1]
参考答え:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function (nums, target) {
let targetIndex = binarySearch(nums, target, 0, nums.length - 1)
if (targetIndex == -1) return [-1, -1]
let l = targetIndex, r = targetIndex
while(l > 0 && nums[l - 1] == target){
l--
}
while(r < nums.length - 1 && nums[r + 1] == target){
r++
}
return [l, r]
};
function binarySearch(arr, val, lo, hi) {
if (hi < lo) return -1
let mid = lo + parseInt((hi - lo) / 2)
if (val < arr[mid]) {
return binarySearch(arr, val, lo, mid - 1)
} else if (val > arr[mid]) {
return binarySearch(arr, val, mid + 1, hi)
} else {
return mid
}
}