题目描述
解题思路
这道题目堪称是二分查找的经典题型,核心题型,模板题型。只要会了这道题目,几乎所有的二分查找的问题都迎刃而解了。
- 定义二分查找中查找左边界的函数,这个函数能够返回左边界的下标,如果数组中有目标元素返回第一个下标,如果数组中的所有元素都小于目标元素,返回的是数组的长度,如果数组中的所有元素都比目标元素大,返回的是下标0,如果数组中没有该元素,但是有比该元素大的值,返回的是第一个比目标值大的下标。
- 如果函数返回的下标对应的值不等于target,则返回[-1,-1].
- 如果存在则返回[findLeft(nums,target),findLeft(nums,target+1)-1]。
var searchRange = function (nums, target) {
// 二分查找查找左边界的模板
function findLeft(nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
let mid = (left + right) >> 1;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
right = mid - 1;
}
}
return left;
}
if (nums[findLeft(nums, target)] != target) {
return [-1, -1];
} else {
return [findLeft(nums, target), findLeft(nums, target + 1) - 1]
}
};
题目反思
这是二分查找的经典题型,只要是排好序的数组,几乎都可以使用这个题目进行求解。