34. Find First and Last Position of Element in Sorted Array

204 阅读1分钟

题目描述

leetcode-cn.com/problems/fi…

分析

通过二分,查找数组 nums 中的两个 index

第一个等于 target 的 index,第一个大于 target 的 index

算法

二分

过程

通过二分查找来找上述的两个 index

在二分中:

如果在循环中 mid 对应的值大于等于 target,可以得到第一个 index

大于则可以得到第二个 index

因此可以通过一个变量来让二分查找的代码完成两个查找任务

代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function(nums, target) {
    const l = binarySearch(nums, target, true)
    const r = binarySearch(nums, target, false) - 1
    
    if (nums[l] !== target && nums[r] !== target) return [-1, -1]
    
    return [l, r]
};

function binarySearch(arr, target, lower) {
    let l = 0, r = arr.length - 1, ans = arr.length
    while (l <= r) {
        const mid = l + ((r - l) >> 1)
        if (arr[mid] > target || lower && arr[mid] >= target) {
            ans = mid
            r = mid - 1
        } else {
            l = mid + 1
        }
    }
    
    return ans
}