トピック:
昇順で配置された整数配列numsと、ターゲット値targetが与えられます。配列内の指定されたターゲット値の開始位置と終了位置を見つけます。
配列にターゲット値ターゲットがない場合は、[-1、-1]を返します。
上級:
この問題を解決するためにO(log n)アルゴリズムを設計および実装できますか?
例1:
入力:nums = [5,7,7,8,8,10]、target = 8
出力:[3,4]
例2:入力:nums = [5,7,7,8,8,10]、target = 6
出力:[-1、-1]
例3:入力:nums = []、target = 0
出力:[-1、-1]促す:
0 <= nums.length <= 105 -109 <= nums
[i] <=
109numsは非減少配列です
-109 <=ターゲット<= 109
アイデア:
公式アイデアを参照
コード:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function(nums, target) {
let ans = [-1, -1];
const leftIdx = binarySearch(nums, target, true);
const rightIdx = binarySearch(nums, target, false) - 1;
if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] === target && nums[rightIdx] === target) {
ans = [leftIdx, rightIdx];
}
return ans;
};
const binarySearch = (nums, target, lower) => {
let left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
演算結果: