34. 在排序数组中查找元素的第一个和最后一个位置
题目描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-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]
提示
- 0 <= nums.length <= 10^5
- 10^ 9 <= nums[i] <= 10^9
- nums 是一个非递减数组
- 10^ 9 <= target <= 10^9
思路
使用二分查找,找到目标 target 在数组 nums的索引位置,再通过条件,查找出左右的边界
左边界left 条件
- nums[left] === target
- left >= 0
右边界right 条件
- nums[right] === target
- right < nums.length
代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function(nums, target) {
let left = 0;
let n = nums.length;
let right = n - 1;
let mid = 0;
while(left <= right){
mid = (left + right) >>> 1;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid - 1;
right = mid + 1;
while(true){
if(nums[left] === target && left >=0){
left --;
}
else if(nums[right] === target && right < n){
right ++;
}else{
return [left+1,right-1]
}
}
}
}
return [-1,-1];
};