在问 · 算法题解

34. 查找元素首尾位置

题目描述

输入一个按非递减顺序排好的整数数组 nums 和整数 target。

返回一个长度为 2 的数组:target 在 nums 中第一次出现的下标和最后一次出现的下标,下标从 0 开始。target 不在数组中时返回 [-1,-1]。

要求时间复杂度为 O(log n)。

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

解释:两个 8 分别在下标 3 和 4。

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

解释:数组中没有 6。

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

解释:空数组中找不到任何值。

数据范围

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • nums 是非递减的。
  • -10^9 <= target <= 10^9

解题思路

分别寻找左右 lower_bound。

为什么正确

左界左侧小于 target,右界右侧大于 target。

复杂度分析

时间 O(log n),额外空间 O(1)。

易错点

注意边界条件并在回溯或弹出后恢复状态。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
 def searchRange(self,a,t):
  def lo(x):
   l,h=0,len(a)
   while l<h:
    m=(l+h)//2
    if a[m]<x:l=m+1
    else:h=m
   return l
  l=lo(t);r=lo(t+1)-1
  return [l,r] if l<len(a) and a[l]==t else [-1,-1]

载入编辑器,自己跑一遍 →

二分查找 专题的其他题目

查看 二分查找 全部题目 →