二分搜索
解题思路
根据题目限制空间复杂度为
O(logn)
,则需要使用 二分搜索 来完成,不可以使用 滑动窗口 ,尽管滑动窗口代码量更加简单;两次二分法查找到 target 的左右边界,返回两次二分的结果;
复杂度
-
时间复杂度:
O(logn)
-
空间复杂度:
O(1)
代码实现
var searchRange = function (nums, target) {
if (nums.length === 0) {
return [-1, -1];
}
let left = searchLeftRange(nums, target);
if (left === -1) {
return [-1, -1];
}
let right = searchRightRange(nums, target);
return [left, right];
};
function searchLeftRange(nums, target) {
let left = 0;
let right = nums.length - 1;
while (left < right) {
let mid = left + Math.floor((right - left) / 2);
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
right = mid;
}
}
// 剩余最后两个元素,需要再次判断 left 元素是否等于 target
if (nums[left] == target) {
return left;
}
return -1;
}
function searchRightRange(nums, target) {
let left = 0;
let right = nums.length - 1;
while (left < right) {
let mid = left + Math.floor((right - left + 1) / 2);
if (nums[mid] <= target) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
leetcode🧑💻 704. 二分查找
上一篇