跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

二分算法详解:查找元素首尾位置及区间查询

二分算法适用于具备二段性的问题,核心在于利用中点缩小搜索区间。解析查找元素首尾位置及区间计数问题,重点演示左右端点二分模版、mid 取整防死循环技巧及结果合法性校验。结合 C++ 实现,对比 STL lower_bound 与 upper_bound 用法,帮助开发者掌握高效查找策略。

Eee_123发布于 2026/3/24更新于 2026/5/77 浏览
二分算法详解:查找元素首尾位置及区间查询

当问题的解具备二段性时,二分算法是寻找答案的高效工具。核心思路是根据中点位置判断目标落在哪一侧,随即舍弃一半区间,时间复杂度为 O(logN)。C++ STL 提供了 lower_bound(大于等于 x 的最小元素)和 upper_bound(大于 x 的最小元素),底层均基于二分实现。

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

题目描述 给定一个按照升序排列的整数数组 nums 和一个目标值 target,找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,返回 [-1, -1]。

算法思路 这道题需要分别找到左边界和右边界。直接遍历是 O(N),利用有序特性可优化至 O(logN)。

  1. 查找左端点:使用二分查找,当 nums[mid] >= target 时,说明目标可能在左侧或就是 mid,因此 right = mid;否则 left = mid + 1。注意循环条件是 left < right,避免死循环。
  2. 查找右端点:同理,但逻辑相反。当 nums[mid] <= target 时,left = mid;否则 right = mid - 1。这里计算 mid 时需要向上取整 (left + right + 1) / 2,防止 left = mid 导致死循环。
  3. 合法性校验:找到端点后,需检查该位置的元素是否真的等于 target,防止数组中无目标值的情况。

代码实现

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.empty()) return {-1, -1};

        // 二分查找左端点
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (nums[mid] >= target) right = mid;
            else left = mid + 1;
        }
        
        if (nums[left] != target) return {-1, -1};
        int retLeft = left;

        // 二分查找右端点
        left = 0; right = nums.size() - 1;
        while (left < right) {
            int mid = (left + right + 1) / 2;
            if (nums[mid] <= target) left = mid;
            else right = mid - 1;
        }
        
        return {retLeft, right};
    }
};

牛可乐和魔法封印

题目描述 给定一个长度为 n 的升序数组 a,进行 q 次查询。每次查询给出一个区间 [x, y],求数组中有多少个元素的值在该区间内。

算法思路 这本质上是区间计数问题。我们需要找到第一个大于等于 x 的位置(左边界)和最后一个小于等于 y 的位置(右边界)。

  1. 确定范围:调用两次二分查找。第一次找左边界 l,第二次找右边界 r。
  2. 边界处理:如果找到的左边界元素小于 x,或者右边界元素大于 y,说明区间内没有符合条件的数,返回 0。
  3. 计算结果:若合法,结果为 r - l + 1。

代码实现

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
typedef long long LL;
LL a[N];
int n;

// 查找区间 [x, y] 内的元素个数
int binary_search(int x, int y) {
    LL l = 1, r = n;
    // 查找左端点:第一个 >= x 的位置
    while (l < r) {
        LL mid = (l + r) / 2;
        if (a[mid] >= x) r = mid;
        else l = mid + 1;
    }
    LL retL = l;
    if (a[l] < x) return 0;

    // 查找右端点:最后一个 <= y 的位置
    l = 1; r = n;
    while (l < r) {
        LL mid = (l + r + 1) / 2;
        if (a[mid] <= y) l = mid;
        else r = mid - 1;
    }
    if (a[r] > y) return 0;
    
    return r - retL + 1;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    
    int q;
    cin >> q;
    while (q--) {
        int x, y;
        cin >> x >> y;
        cout << binary_search(x, y) << endl;
    }
    return 0;
}

掌握左右端点的二分模版、mid 取整技巧以及端点合法性判断,是规避死循环误区的关键。每一道模版题的练习,都是突破瓶颈的底气。

目录

  1. 在排序数组中查找元素的第一个和最后一个位置
  2. 牛可乐和魔法封印
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • WebView 概念、功能、应用场景及优劣势深度解析
  • n8n Webhook 节点构建自动化触发器
  • 本地私有化 AI 知识库搭建指南:Obsidian + OpenCode + MCP Server
  • C++ Qt 摄像头视频采集实战:V4L2 与多线程
  • Claude Code 本地环境配置与使用指南
  • 基于官方 API 搭建 QQ 群聊机器人实战指南
  • OpenClaw 开源 AI 助手:功能特性与云端部署指南
  • 豆包 AI API Key 获取及前端项目接入指南
  • 即梦数字人视频生成 API 调用示例
  • Telegram 搜索机器人搭建指南(含 Python 脚本)
  • Stable Diffusion 与 ComfyUI 整合包安装及常见问题解决
  • Python 数据分析入门:集中趋势与离散程度
  • ARINC 825 航电通信总线标准详解
  • Promise.resolve 方法详解
  • 5 款主流中文 AI 大语言模型功能评测与选型指南
  • llama-cpp-python 安装配置与性能优化指南
  • Qwen3.5 开源详解:0.8B 至 397B 模型代际升级与选型指南
  • iOS App Store 上架全流程:打包、上传与审核指南
  • Java 入门前的计算机基础知识
  • C++ STL list 模拟实现:双向链表与迭代器封装

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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