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

66 阅读1分钟

leetcode-34.png

用二分查找找到符合条件的左右边界,这里考察的点还是在nlogn的时间内来处理这件事
所以直接用二分查找,然后在left--,right++这样子处理,时间复杂度还是达不到要求
还是要全部都用二分来查找

var searchRange = function(nums, target) {
    // Helper function to find the first occurrence of the target
    const findFirst = () => {
        let left = 0, right = nums.length - 1;
        while (left <= right) {
            let mid = Math.floor((left + right) / 2);
            // 一直处理右边界,然后逼近左边界
            if (nums[mid] >= target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    };

    // Helper function to find the last occurrence of the target
    const findLast = () => {
        let left = 0, right = nums.length - 1;
        while (left <= right) {
            let mid = Math.floor((left + right) / 2);
            // 一直处理左边界,然后逼近右边界
            if (nums[mid] <= target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return right;
    };

    let first = findFirst();
    let last = findLast();

    // Validate if the target exists in the array
    if (first <= last && nums[first] === target && nums[last] === target) {
        return [first, last];
    }

    return [-1, -1];
};

上面的代码感觉有点重复,下面直接把两个函数糅合起来,做下判断即可

var searchRange = function (nums, target) {
    var binarySearch = function (isLeft) {
        let left = 0, right = nums.length - 1
        let result = -1
        while (left <= right) {
            let mid = Math.floor((left + right) / 2)
            if (nums[mid] < target) {
                left = mid + 1
            } else if (nums[mid] > target) {
                right = mid - 1
            } else {
                result = mid
                if (isLeft) {
                    right = mid - 1
                } else {
                    left = mid + 1
                }
            }
        }
        return result
    }
    let leftIndex = binarySearch(true)
    let rightIndex = binarySearch(false)
    return [leftIndex, rightIndex]
};