跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

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

针对非递减排序整数数组,使用二分查找模板定位目标值的起始和结束位置。通过实现查找第一个大于等于目标值索引的通用函数 binarySearch,直接获取起始位置;利用查找第一个大于等于目标值加一的位置减一得到结束位置。若起始位置越界或值不匹配则返回 [-1, -1]。该方案时间复杂度为 O(log n),避免线性遍历,适用于有序数组边界查找场景。

flc发布于 2026/3/21更新于 2026/7/1834 浏览
LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

题目描述

给定非递减排序的整数数组 nums 和目标值 target,需找到 target 在数组中的第一个位置和最后一个位置;若不存在则返回 [-1, -1],要求时间复杂度为 O(log n)。

核心要求:依托排序数组特性,用二分查找高效定位边界,拒绝线性遍历。

核心思路:用'找第一个≥目标值'的二分模板统一边界逻辑

二分查找的核心是在有序序列中定位满足条件的第一个位置。我们只需实现一个通用二分模板 ——查找数组中第一个大于等于目标值的索引(方法名统一为 binarySearch),即可统一解决本题的两个边界问题:

第一个位置:直接调用 binarySearch 查找 target,得到第一个≥target 的索引;若索引越界或对应值不等于 target,说明 target 不存在。 最后一个位置:等价于调用 binarySearch 查找第一个**≥target+1** 的索引,再将结果减 1。原因是:非递减数组中,target+1 的首个出现位置的前一位,就是 target 的最后一次出现位置。

上述最后一个位置的转化可以参考以下表格:

你想找的等价问题(转换思路)调用 binarySearch返回的 idx 含义最终答案(位置或值)举例 (nums=[1,3,3,5,7])
第一个 >= x原问题binarySearch(nums, x)第一个 >= x 的位置idx(若越界则无解)x=3 → idx=1(值 3)
第一个 > x第一个 >= (x+1)binarySearch(nums, x+1)第一个 >= x+1 的位置idx(若越界则无解)x=3 → idx=3(值 5)
最后一个 < x第一个 >= x 的左边binarySearch(nums, x)第一个 >= x 的位置idx - 1(若 idx=0 则无解)x=3 → idx=1,答案 0(值 1)
最后一个 <= x第一个 > x 的左边 或 第一个 >= x+1 的左边binarySearch(nums, x+1)第一个 > x 的位置idx - 1(若 idx=0 则无解)x=3 → idx=3,答案 2(值 3)

代码实现

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int start = binarySearch(nums, target); // 边界校验:target 不存在的情况
        if (start == nums.length || nums[start] != target) {
            return new int[]{-1, -1};
        }
        // 推导最后一个位置
        int end = binarySearch(nums, target + 1) - 1;
        return new int[]{start, end};
    }

    /**
     * 通用二分模板:返回数组中第一个大于等于 target 的索引
     * @param nums 非递减排序的数组
     * @param target 目标值
     * @return 首个≥target 的索引;若所有元素都小于 target,返回数组长度
     */
    private int binarySearch(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            // 避免(left + right) 溢出,等价于(left + right) / 2
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                // 目标值在右区间,左边界右移
                left = mid + 1;
            } else {
                // 目标值在左区间,右边界左移
                right = mid - 1;
            }
        }
        return left;
    }
}
关键解析

binarySearch 模板:严格实现'找第一个≥目标值'的逻辑,循环结束后 left 即为目标索引,天然处理'所有元素小于目标值'的越界场景。 存在性校验:通过 start 的越界判断和值匹配,直接筛除 target 不存在的情况。 最后位置推导:借助 binarySearch(nums, target + 1) 的查找结果,一步计算出 target 的最后位置,无需额外二分。

目录

  1. 题目描述
  2. 核心思路:用“找第一个≥目标值”的二分模板统一边界逻辑
  3. 代码实现
  4. 关键解析
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GitHub Copilot 学生认证与激活完整指南
  • AI 艺术二维码制作教程:使用 Stable Diffusion 生成可扫描创意图像
  • 大模型算法岗常见面试题 100 道
  • 通用大模型与行业大模型对比:为何企业更需定制化解决方案
  • 文心一言 4.5 开源模型深度解析:单卡部署与中文场景优化
  • OpenClaw:从认知到行动的智能体框架解析
  • Flutter package:web 在 OpenHarmony 中的 Wasm GC 与 DOM 互操作
  • Java 实体 Bean 的核心规范与应用
  • KingbaseES 内核级 SQL 防火墙:白名单机制与性能实测
  • 视觉 Transformer (ViT) 技术原理及三篇经典论文解析
  • 多模态大模型垂直微调实战:Qwen3-VL-4B-Thinking 与 Llama Factory
  • 前端状态管理:Recoil 原子化实践
  • LangChain 大型语言模型 (LLM) 应用开发技术详解
  • Web 服务器负载均衡深度解析:Nginx 配置实践
  • HarmonyOS ArkTS 前景模糊样式 foregroundBlurStyle 详解
  • 大语言模型(LLM)核心知识体系概览
  • Python 数据分析常用图表绘制指南
  • AI 前端详解:概念、场景与接入原理
  • C++ 二叉搜索树 (BST) 详解:原理、核心操作与实战实现
  • 国内外主流 AI 大模型盘点与技术趋势分析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online