[LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置] | 刷题打卡

153 阅读1分钟

一、题目描述:

leetcode-cn.com/problems/fi…
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
****示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

二、思路分析:

  • 二分法,分别求左端点和右端点

三、AC 代码:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function (nums, target) {

    let left = 0
    let right = nums.length - 1

    function getLeft(left, right) {
        if (nums[left] === target) {
            return left
        }
        if (left >= right) {
            return -1
        }
        const mid = Math.floor((left + right) / 2)
        if (nums[mid] === target) {
            return getLeft(left, mid)
        } else if (nums[mid] > target) {
            return getLeft(left, mid - 1)
        } else {
            return getLeft(mid + 1, right)
        }
    }
    function getRight(left, right){
        if (nums[right] === target) {
                return right
            }
        if (left >= right) {
            return -1
        }
        const mid = Math.ceil((left + right) / 2)
        if (nums[mid] === target) {
            return getRight(mid, right)
        } else if (nums[mid] > target) {
            return getRight(left, mid - 1)
        } else {
            return getRight(mid + 1, right)
        }
    }

    return [getLeft(left, right), getRight(left, right)]
};