Skip to content

Latest commit

 

History

History
88 lines (61 loc) · 1.71 KB

File metadata and controls

88 lines (61 loc) · 1.71 KB

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

相关标签

  • 数组
  • 二分查找

问题描述

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

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

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

 

示例 1:

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

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]

示例 3:

输入:nums = [], target = 0 输出:[-1,-1]

 

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

题解

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

    let start = -1
    let end = -1

    while(left <=right) {
        const mid = Math.floor((left + right) / 2)
        const midData = nums[mid]
        if(midData === target) {
            start = mid 
            right = mid - 1
        } else if(midData < target) {
            left = mid + 1
        } else {
            right = mid -1
        }
    }
    left = 0
    right = len -1

    while(left <= right) {
        const mid = Math.floor((left+ right) /2) 
        const midData = nums[mid]
        if(midData === target) {
            end = mid
            left = mid + 1 
        } else if(midData < target) {
            left = mid  + 1
        } else {
            right = mid - 1
        }
    }

    return [start, end]
};