给你一个按照非递减顺序排列的整数数组
nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target,返回[-1, -1]。你必须设计并实现时间复杂度为
O(log n)的算法解决此问题。
解法 二分查找
思路
这题需要两个二分查找,因为分别寻找 target 的左右边界,模板的判定条件不同。
代码
function searchRange(nums: number[], target: number): number[] {
let left = 0;
let right = nums.length - 1;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
if (nums[left] !== target) {
return [-1, -1];
}
let l = left;
right = nums.length - 1;
while (left < right) {
const mid = Math.floor((left + right + 1) / 2);
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid;
}
}
return [l, left];
};
时空复杂度
时间复杂度:O(logn)
空间复杂度:O(1)