【算法】二分查找算法详解与模板总结:从原理到变体,一篇就够了

【算法】二分查找算法详解与模板总结:从原理到变体,一篇就够了

目录

二分查找算法详解

二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。它的核心思想是分而治之,每次将搜索范围缩小一半。

基本原理

想象你在查英语字典找"apple"这个词:

  1. 翻开字典的中间
  2. 如果这一页的单词在"apple"之前,就往后翻
  3. 如果这一页的单词在"apple"之后,就往前翻
  4. 重复这个过程,直到找到"apple"

这就是二分查找的生活例子。

算法步骤

假设有一个升序数组 arr,要查找目标值 target

  1. 初始化左指针 left = 0,右指针 right = n-1
  2. left <= right 时循环:
    • 计算中间位置 mid = left + (right - left) / 2(防止整数溢出)
    • 如果 arr[mid] == target,找到目标,返回 mid
    • 如果 arr[mid] < target,说明目标在右半部分,left = mid + 1
    • 如果 arr[mid] > target,说明目标在左半部分,right = mid - 1
  3. 循环结束未找到,返回 -1

代码实现

基础版本(查找精确值)

intbinarySearch(vector<int>& nums,int target){int left =0;int right = nums.size()-1;while(left <= right){// 避免 (left + right) 可能溢出int mid = left +(right - left)/2;if(nums[mid]== target){return mid;// 找到目标}elseif(nums[mid]< target){ left = mid +1;// 目标在右半部分}else{ right = mid -1;// 目标在左半部分}}return-1;// 未找到}

时间复杂度分析

  • 时间复杂度:O(log n)
    • 每次比较后,搜索范围减半
    • 对于大小为 n 的数组,最多需要 log₂(n) 次比较
  • 空间复杂度:O(1)
    • 只需要常数级别的额外空间

二分查找的变体

1. 查找第一个等于目标的位置

intfindFirst(vector<int>& nums,int target){int left =0, right = nums.size()-1;int result =-1;while(left <= right){int mid = left +(right - left)/2;if(nums[mid]== target){ result = mid;// 记录当前位置 right = mid -1;// 继续向左查找}elseif(nums[mid]< target){ left = mid +1;}else{ right = mid -1;}}return result;}

2. 查找最后一个等于目标的位置

intfindLast(vector<int>& nums,int target){int left =0, right = nums.size()-1;int result =-1;while(left <= right){int mid = left +(right - left)/2;if(nums[mid]== target){ result = mid;// 记录当前位置 left = mid +1;// 继续向右查找}elseif(nums[mid]< target){ left = mid +1;}else{ right = mid -1;}}return result;}

3. 查找第一个大于等于目标的位置

intfindFirstGreaterOrEqual(vector<int>& nums,int target){int left =0, right = nums.size()-1;while(left <= right){int mid = left +(right - left)/2;if(nums[mid]>= target){ right = mid -1;// 虽然满足条件,但继续向左找更小的}else{ left = mid +1;// 当前太小,向右找}}return left;// left 就是第一个 >= target 的位置}

常见应用场景

  1. 有序数组的查找 - 最基础的应用
  2. 求平方根 - 在 0 到 x 之间二分查找
  3. 旋转数组的查找 - 如 [4,5,6,7,0,1,2] 中查找
  4. 寻找峰值 - 在山峰数组中找到最大值
  5. 在答案空间二分 - 如"找到最小速度使得在规定时间内完成任务"

注意事项和常见错误

  1. 循环条件left <= right vs left < right 的选择
  2. 边界更新left = mid + 1right = mid - 1 要正确
  3. 整数溢出:使用 mid = left + (right - left) / 2 而非 (left + right) / 2
  4. 数组必须有序:二分查找的前提是有序,否则结果错误
  5. 重复元素:处理重复元素时要明确需求(找第一个/最后一个)

二分查找虽然原理简单,但细节容易出错。建议多练习不同类型的题目,熟练掌握各种变体的写法。

二分算法模板总结

在这里插入图片描述
//找左边while(left < right){int mid = left +(right - left)/2;//左边if(nums[mid]>= target) right = mid;//右边else left = mid +1;}//找右边while(left < right){int mid = left +(right - left+1)/2;//右边if(nums[mid]<= target) left = mid;//左边else right = mid -1;}

实战练习题目(含链接)

⼆分查找(easy)
在排序数组中查找元素的第⼀个和最后⼀个位置(medium)
搜索插⼊位置(easy)
x 的平⽅根(easy)
⼭峰数组的峰顶(easy)
寻找峰值(medium)
搜索旋转排序数组中的最⼩值(medium)
0〜n-1 中缺失的数字(easy)

Read more

开源Jira替代品:

概述 相信很多有一定年头工作经验的软件研发工作者,接触到的第一款项目管理工具都是Jira。 考虑这样一种场景:因为各种各样的原因(比如Server版已停售),决定抛弃Jira,选择一款平替产品。总得来说有两大方向,闭源产品和开源项目。无论是闭源产品还是开源项目,关键在于识别核心痛点(如成本、学习曲线、本土化需求),然后根据团队的具体情况来权衡利弊。 决策关键维度: * 成本与预算:最直接的驱动因素;Jira的订阅成本较高。开源产品虽可省去授权费,但必须评估自有IT团队的运维成本。国产SaaS工具(如板栗看板、Tower)在价格上通常更有优势,甚至提供免费版。 * 功能与工作流匹配度:需明确团队的核心需求。 * 如果追求极致的灵活自定义和复杂工作流,Jira、ONES、ClickUp是强项。 * 如果团队采用标准的敏捷开发(Scrum、Kanban),禅道、TAPD、飞书项目都能很好支持。 * 如果需求是轻量、可视化的任务协作,Trello、板栗看板、Tower更为合适。 * 技术掌控与数据安全:这是选择开源或闭源的核心。 * 选择开源产品意味着你对

By Ne0inhk

GitHub 镜像站点

国内访问 GitHub 有时会遇到速度慢或不稳定的情况,这时 GitHub 镜像站点就能帮上忙。它们通过代理或缓存机制,让你更顺畅地浏览仓库、下载资源甚至克隆代码。 下面表格汇总了一些常见的镜像站及其主要用途 镜像站点名称访问地址主要特点适用场景 bgithub.xyz https://bgithub.xyz/直接替换域名访问,操作简单日常浏览仓库、克隆代码 kkgithub.com https://kkgithub.com/直接替换域名,支持代码查看和 Issue日常浏览仓库、查看 Issues gitclone.com https://gitclone.com/提供在线工具生成克隆命令,适合命令行操作需要快速获取仓库克隆命令 kgithub.com https://kgithub.com/支持代码查看、Issue 和评论,但不支持注册和文件上传阅读代码、参与讨论(无需上传文件) ghproxy.net https:

By Ne0inhk

GTE-Pro开源大模型部署教程:从零搭建高精度非结构化文本检索系统

GTE-Pro开源大模型部署教程:从零搭建高精度非结构化文本检索系统 1. 项目介绍与核心价值 GTE-Pro是一个基于阿里达摩院GTE-Large架构构建的企业级语义检索引擎。与传统的"关键词匹配"搜索不同,这个系统能够真正理解文本的深层含义,实现"搜意不搜词"的智能检索体验。 想象一下这样的场景:你在公司内部知识库中搜索"怎么报销吃饭的发票",传统搜索可能要求你输入准确的"餐饮费用报销流程"这样的关键词,但GTE-Pro能够理解你的真实意图,直接找到相关的报销政策文档。这就是语义搜索的魅力所在。 这个系统特别适合需要处理大量非结构化文本数据的企业,比如法律文档、技术文档、客户服务知识库等。所有数据处理都在本地完成,确保数据安全,符合金融、政务等对数据隐私要求严格的行业标准。 2. 环境准备与快速部署 2.1 系统要求 在开始部署之前,请确保你的系统满足以下要求: * 操作系统: Ubuntu 20.04/22.04

By Ne0inhk
保姆级教程:Windows Git 安装全流程,手把手带你从 0 到 1 (2025版)

保姆级教程:Windows Git 安装全流程,手把手带你从 0 到 1 (2025版)

Git 是程序员的必备工具。对于 Windows 用户来说,安装过程中的几十个英文选项往往让人头大。本教程将手把手带您走完安装流程,确保您的环境配置最优化、最符合现代开发标准。 第一步:下载安装包 1. 下载地址 * 官方网站:git-scm.com/download/win * 下载方式:推荐直接点击页面上的 "Click here to download" 或者 "Git for Windows/x64 Setup" 下载独立的 .exe 安装程序。 * 注:虽然可以用 Winget 命令行下载,但传统安装包更适合初次配置。 2. 版本选择 (x64 vs ARM64) * 绝大多数电脑(Intel/AMD

By Ne0inhk