34. 在排序数组中查找元素的第一个和最后一个位置
描述
- 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
- 你的算法时间复杂度必须是 O(log n) 级别。
- 如果数组中不存在目标值,返回 [-1, -1]。
示例 1
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
思路 1
- 根据二分查找,找到左边第一个不小于目标值的位置
- 从上一步中的位置开始到最后,二分查找,确定右边最后一个符合条件值的位置
- 得到结果
解法 1
function getBinarySearchLowerBound (array, low, high, target) {
while (low < high) {
const mid = Math.floor((low + high) / 2);
if (array[mid] < target) {
low = mid + 1;
} else {
high = mid;
}
}
return array[low] === target ? low : -1;
}
function getBinarySearchUpperBound (array, low, high, target) {
while (low < high) {
const mid = Math.ceil((low + high) / 2);
if (array[mid] > target) {
high = mid - 1;
} else {
low = mid;
}
}
return array[high] === target ? high : -1;
}
const searchRange = function (nums, target) {
const size = nums.length;
const low = getBinarySearchLowerBound(nums, 0, size - 1, target);
if (low === -1) {
return [-1, -1];
}
const high = getBinarySearchUpperBound(nums, low >= 0 ? low : 0, size - 1, target);
return [low, high];
};