0
点赞
收藏
分享

微信扫一扫

js返回元素的第一个和最后一个位置

兔八哥软件爱分享 2022-04-21 阅读 170

题目:给定一个按照升序排列的整数数组 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]

};

欢饮兄弟姐妹一起讨论~

举报

相关推荐

0 条评论