题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
分析:题目中提到开始位置与结束位置,我们立马就想到双指针,指向头指针与尾指针。因为数组已经有序,所以可以利用二分查找来找目标值target的具体位置。
循环条件:左指针小于等于右指针。
二分查找:mid=(left+right)>>1,(向上取整),如果目标值恰好等于中间值,则跳出循环,我们先放着等会说。如果目标值小于中间值的话则让右指针等于中间值减一(再往前推一位),反之让左指针等于中间值 加一(再往后推一位)。
好,现在讨论目标值恰好等于中间值的情况。现在已经确定好了二分后的数组了。则在新的数组基础上设置i ,j 两个指针,初始让i与j都等于mid。另此i的值等于i-1的值,同时i--(从mid往前找)。另此j对应的值等于j+1的值时,同时j++(从mid往后找)。 --------找与目标值相等的值。 得到i,j值跳出循环。
以上是左指针小于等于右指针的情况。如果左指针大于右指针则直接返回[-1,-1]。
代码实现
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function (nums, target) {
var left = 0, right = nums.length - 1;
while (left <= right) {
var mid = (left + right) >> 1
if (nums[mid] === target) break
if (nums[mid] < target) {
left = mid + 1
} else right = mid - 1
}
if (left > right) return [-1, -1];
let i = mid, j = mid;
while (nums[i] === nums[i - 1]) i--;
while (nums[j] === nums[j + 1]) j++;
return [i, j]
};
欢饮兄弟姐妹一起讨论~