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

47 阅读1分钟

题目链接

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

解法 二分查找

思路

这题需要两个二分查找,因为分别寻找 target 的左右边界,模板的判定条件不同。

代码

function searchRange(nums: number[], target: number): number[] {
    let left = 0;
    let right = nums.length - 1;

    while (left < right) {
        const mid = Math.floor((left + right) / 2);
        if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    if (nums[left] !== target) {
        return [-1, -1];
    }
    let l = left;
    right = nums.length - 1;
    while (left < right) {
        const mid = Math.floor((left + right + 1) / 2);
        if (nums[mid] > target) {
            right = mid - 1;
        } else {
            left = mid;
        }
    }
    return [l, left];
};

时空复杂度

时间复杂度:O(logn)

空间复杂度:O(1)