用二分查找找到符合条件的左右边界,这里考察的点还是在nlogn的时间内来处理这件事
所以直接用二分查找,然后在left--,right++这样子处理,时间复杂度还是达不到要求
还是要全部都用二分来查找
var searchRange = function(nums, target) {
// Helper function to find the first occurrence of the target
const findFirst = () => {
let left = 0, right = nums.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
// 一直处理右边界,然后逼近左边界
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
};
// Helper function to find the last occurrence of the target
const findLast = () => {
let left = 0, right = nums.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
// 一直处理左边界,然后逼近右边界
if (nums[mid] <= target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return right;
};
let first = findFirst();
let last = findLast();
// Validate if the target exists in the array
if (first <= last && nums[first] === target && nums[last] === target) {
return [first, last];
}
return [-1, -1];
};
上面的代码感觉有点重复,下面直接把两个函数糅合起来,做下判断即可
var searchRange = function (nums, target) {
var binarySearch = function (isLeft) {
let left = 0, right = nums.length - 1
let result = -1
while (left <= right) {
let mid = Math.floor((left + right) / 2)
if (nums[mid] < target) {
left = mid + 1
} else if (nums[mid] > target) {
right = mid - 1
} else {
result = mid
if (isLeft) {
right = mid - 1
} else {
left = mid + 1
}
}
}
return result
}
let leftIndex = binarySearch(true)
let rightIndex = binarySearch(false)
return [leftIndex, rightIndex]
};