ID:34.在排序数组中查找元素的第一个和最后一个位置

77 阅读1分钟

考点:二分查找

题目链接

思路

折半查找即可,注意保存左端点和右端点

var searchRange = function(nums, target) {
    let min = -1, max = -1;
    const bisearch = (left, right) => {
        // 递归终止条件
        if(left > right) return;
        // 中点
        const half = left + Math.floor((right - left) / 2);
        // 判断是否需要递归
        let searchLeft = true, searchRight = true;
        // 如果中点等于target
        if(nums[half] === target) {
            // 如果中点为0或者中点前一位的元素小于target
            // 此时说明中点位置即为开头
            // 那么也不需要去查找左边的部分了
            // 中点后一位元素大于target时同理
            if(half === 0 || nums[half - 1] < target) {
                min = half;
                searchLeft = false;
            }
            if(half === nums.length - 1 || nums[half + 1] > target) {
                max = half;
                searchRight = false;
            }
        }
        // 递归查找中点左边和右边
        searchLeft && bisearch(left, half - 1);
        searchRight && bisearch(half + 1, right);
    }
    bisearch(0, nums.length - 1);
    return [min, max];
};