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

二分算法实战:查找元素范围与区间计数

二分查找适用于具有二段性的问题,通过不断缩小搜索区间将时间复杂度降至 O(logN)。结合两道经典例题,演示了如何在排序数组中定位元素的首尾位置及统计区间数量。重点讲解了左右边界查找的二分模板、mid 取值技巧及端点合法性校验,帮助读者规避死循环风险,掌握算法实战要点。

竹影清风发布于 2026/3/16更新于 2026/6/1228 浏览
二分算法实战:查找元素范围与区间计数

二分算法基础

当问题的解空间具有'二段性'时,二分查找是高效的选择。核心思路是根据中点值判断目标位于哪一侧,从而舍弃一半区间。时间复杂度通常为 O(logN)。

STL 提供了便捷的二分工具:lower_bound 返回大于等于 x 的最小元素迭代器,upper_bound 返回大于 x 的最小元素迭代器,两者均为 O(log N)。理解底层原理有助于处理更复杂的边界情况。

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

题目描述

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

解题思路

我们需要分别找到左边界和右边界。

  1. 找左边界:寻找第一个大于等于 target 的位置。若该位置的值不等于 target,说明不存在。
  2. 找右边界:寻找最后一个小于等于 target 的位置。
  3. 注意细节:计算中点时需防止溢出,且左右边界的收缩逻辑不同,避免死循环。

代码实现

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 - left) / 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 - left + 1) / 2; // 向上取整,防止死循环
            if (nums[mid] <= target) left = mid;
            else right = mid - 1;
        }
        
        return {retLeft, right};
    }
};

牛可乐和魔法封印

题目描述

给定 n 个有序数,进行 q 次查询,每次询问区间 [x, y] 内有多少个数。

解题思路

这本质上是求满足条件的数的个数。利用二分查找找到第一个大于等于 x 的位置(左端点)和最后一个小于等于 y 的位置(右端点)。若区间合法,则数量为 右端点 - 左端点 + 1。需注意判断端点是否越界或不符合条件。

代码实现

#include <iostream>
using namespace std;

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

int binary_search(int x, int y) {
    LL l = 1, r = n;
    
    // 查找左端点
    while (l < r) {
        LL mid = l + (r - l) / 2;
        if (a[mid] >= x) r = mid;
        else l = mid + 1;
    }
    LL retL = l;
    if (a[l] < x) return 0; // 判断合法性
    
    // 查找右端点
    l = 1; r = n;
    while (l < r) {
        LL mid = l + (r - l + 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. 在排序数组中查找元素的第一个和最后一个位置
  3. 题目描述
  4. 解题思路
  5. 代码实现
  6. 牛可乐和魔法封印
  7. 题目描述
  8. 解题思路
  9. 代码实现
  10. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • VR、具身智能与人形机器人:通往现实世界的智能接口
  • 宇树 Qmini 双足机器人开源方案:硬件结构与控制系统详解
  • 前端三年成长复盘:从低代码到互联网工程化的实战历程
  • Android 音视频全栈开发学习路线与核心笔记整理
  • AI 大模型技术入门、进阶与职业发展路径详解
  • Web 开发中五种核心加密算法实战与原理
  • 腾讯混元图像 3.0 图生图模型开源,LMArena 评测跻身全球第一梯队
  • Unity+AI 使用自然语言制作小游戏:飞翔的牛马
  • OpenClaw 飞书 AI 办公机器人搭建指南:本地模型与 Skills 集成
  • Python入门指南:什么是Python、为什么学Python、如何学习Python
  • 2026 职场生存法则:AI 创作者 AMA 活动深度解析
  • 多 OpenClaw 机器人对接飞书实现群聊配置
  • 知网 AIGC 检测不通过?三款降 AI 工具实测对比
  • 文心 ERNIE 4.5 开源模型技术分析、部署与评测
  • 宇树 G1 人形机器人强化学习训练配置与奖励函数解析
  • 企业为何弃用 MinIO 及开源替代方案分析
  • Linux 进程替换详解:从 fork 到 exec 的完整链路
  • AI 大模型在制造业的深度融合与应用场景
  • Whisper.cpp 完整使用指南
  • 网络安全领域主流认证体系解析与选择指南

相关免费在线工具

  • 加密/解密文本

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