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

在排序数组中查找元素的第一个和最后一个位置(二分查找)

在排序数组中查找目标值的起始和结束位置。通过两次二分查找分别确定左边界和右边界。左边界查找时若 mid 小于目标值则左移,否则右移;右边界查找时若 mid 小于等于目标值则左移,否则右移。注意处理整数溢出及死循环情况,时间复杂度为对数级。

时间旅人发布于 2026/2/13更新于 2026/7/3036 浏览
在排序数组中查找元素的第一个和最后一个位置(二分查找)

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

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

题目描述:

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

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

1.1 算法思路——二分查找

使用的还是二分思想,就是根据数据的性质,在某种判断条件下将区间一分为二,然后舍去其中一个区间,然后在另一个区间内查找。方便叙述,用 x 表示该元素,resLeft 表示左边界,resRight 表示右边界。

1.2 后两个模版:思路

1.2.1 寻找左边界思路
  1. 寻找左边界

(1) 我们注意到以左边界划分的两个区间的特点:

  1. 左边区间 [left, resLeft-1] 都是小于的;
  2. 右边区间(包括左边界)[resLeft, right] 都是大于等于的。
  1. 因此,关于 mid 的落点,我们可以分为下面两种情况:

(1) 当我们的 mid 落在 [left, resLeft-1] 区间的时候,也就是 nums[mid] < target。说明 [left, mid] 都是可以舍去的,此时更新 left 到 mid + 1 的位置,继续在 [mid+1, right] 上寻找左边界; (2) 当 mid 落在 [resLeft, right] 的区间的时候,也就是 nums[mid] >= target。 说明 [mid+1, right](因为 mid 可能是最终结果,不能舍去)是可以舍去的,此时更新 right 到 mid 的位置,继续在 [left, mid] 上寻找左边界。

  1. 由此,就可以通过二分,来快速寻找左边界。

注意:这里找中间元素需要向下取整。

因为后续移动左右指针的时候: (1) 左指针:left=mid+1,是会向后移动的,因此区间是会缩小的; (2) 右指针:right=mid,可能会原地踏步(比如:如果向上取整的话,如果剩下 1, 2 两个元素,left == 1,right == 2,mid == 2。更新区间之后,left, right, mid 的值没有改变,就会陷入死循环)。

因此一定要注意,当 right = mid 的时候,要向下取整。

1.2.2 寻找右边界思路
  1. 寻找右边界: (1) 用 resRight 表示右边界; (2) 我们注意到右边界的特点:
  1. 左边区间(包括右边界)[left, resRight] 都是小于等于的;
  2. 右边区间 [resRight + 1, right] 都是大于的。
  1. 因此,关于 mid 的落点,我们可以分为下面两种情况:

(1) 当我们的 mid 落在 [left, resRight] 区间的时候,说明 [left, mid-1](mid 不可以舍去,因为有可能是最终结果)都是可以舍去的,此时更新 left 到 mid 的位置; (2) 当 mid 落在 [resRight + 1, right] 的区间的时候,说明 [mid, right] 内的元素是可以舍去的,此时更新 right 到 mid-1 的位置。

  1. 由此,就可以通过二分,来快速寻找右边界。

注意:这里找中间元素需要向上取整。

因为后续移动左右指针的时候: (1) 左指针:left=mid,可能会原地踏步(比如:如果向下取整的话,如果剩下 1, 2 两个元素,left == 1,right == 2,mid==1。更新区间之后,left, right, mid 的值没有改变,就会陷入死循环); (2) 右指针:right=mid-1,是会向前移动的,因此区间是会缩小的。

因此一定要注意,当 left = mid 的时候,要向上取整。

1.3 二分查找算法总结

请大家一定不要觉得背下模板就能解决所有二分问题。二分问题最重要的就是要分析题意,然后确定要搜索的区间,根据分析问题来写出二分查找算法的代码。

要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七八糟的题解

1.4 模板记忆技巧

  1. 关于什么时候用三段式,还是二段式中的某一个,一定不要强行去用,而是通过具体的问题分析情况,根据查找区间的变化确定指针的转移过程,从而选择一个模板;
  2. 当选择两段式的模板时—— 在求 mid 的时候,只有 right-1 的情况下,才会向上取整(也就是 +1 取中间数)。

1.5 算法实现

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.size() == 0) return {-1,-1};
        int begin = 0;
        int left = 0, right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) left = mid + 1;
            else right = mid;
        }
        if(nums[left] != target) return{-1,-1};
        else begin = left;
        left = 0, right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target) left = mid;
            else right = mid - 1;
        }
        return {begin,right};
    }
};

时间复杂度:O(logn),空间复杂度:O(1)。

目录

  1. 在排序数组中查找元素的第一个和最后一个位置
  2. 1.1 算法思路——二分查找
  3. 1.2 后两个模版:思路
  4. 1.2.1 寻找左边界思路
  5. 1.2.2 寻找右边界思路
  6. 1.3 二分查找算法总结
  7. 1.4 模板记忆技巧
  8. 1.5 算法实现
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 2023 年数据分析行业发展前景与高薪领域分析
  • CSS 元素显示模式详解:块级、行内及转换
  • C++Qt 实现的邮政客户投诉工单处理系统
  • RISC-V 五级流水线 CPU 取指通路时序优化实战
  • 基于 STM32 的智能家居环境监测系统设计
  • TortoiseGit 安装与基本操作指南
  • 2026 年高校 AIGC 检测政策汇总
  • JavaScript 函数柯里化:原理与通用实现
  • 网络安全自学指南:从基础原理到渗透测试实战路径
  • .NET 集成 GoView 低代码可视化大屏实战指南
  • OpenClaw 开源 AI 智能体框架的诞生背景与历史回顾
  • Kotlin 根据日期获取星座的实现
  • Nginx 实战:前后端项目配置 HTTPS 指南
  • 基于 LangChain 从零搭建 AI Agent 实战指南
  • 使用 Java 客户端调用 Elasticsearch API 实战指南
  • 大模型智能体(Agent)架构与核心原理
  • Apache Shiro JSP 标签库详解
  • LangChain 中 RAG 模型的应用步骤与技巧
  • 使用 Whisper 构建企业级离线语音转录系统
  • Python 网络爬虫实战:从原理到数据抓取与存储

相关免费在线工具

  • 加密/解密文本

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

  • Gemini 图片去水印

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

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online