当前位置: 首页 > article >正文

二分查找看这篇就够了!Java 版超详细讲解+高频题解

二分查找看这篇就够了Java 版超详细讲解高频题解大家好今天我们来彻底吃透二分查找。作为算法面试、笔试中的“常青树”它是必考且基础的核心知识点看似只有“左右指针中间值对比”这一个简单逻辑但实际应用中边界处理、区间收缩、题型变形等细节极易出错很多人刷题时常常陷入死循环或边界遗漏的困境。今天我会用Java 语言从基础原理入手拆解标准模板再结合LeetCode高频真题实战演练一步步带你吃透二分查找轻松应对各类面试考点。一、什么是二分查找二分查找又称折半查找是一种高效的查找算法其核心适用前提有两个一是数组必须有序升序或降序均可本文默认以升序为例二是数组中无重复元素有重复元素的场景会在后续边界查找中专门讲解。核心思想通俗解读每次查找时将当前的搜索区间一分为二锁定中间位置的元素以此为基准进行判断通过中间元素与目标值的大小对比直接舍弃不可能包含目标值的一半区间无需逐一遍历仅在剩下的另一半区间中继续重复“分半-判断-舍弃”的流程直到找到目标值或确定目标值不存在时间复杂度为O(log n)n为数组长度相较于暴力查找的O(n)效率提升极为明显尤其在数据量较大如n10000时差距会格外突出。一句话总结有单调性就可以二分。这里的单调性不仅指数组整体有序只要能将搜索区间划分为“满足条件”和“不满足条件”两部分且两部分边界清晰就能用二分思想解题。二、最基础模板LeetCode 704 二分查找这是二分查找的入门经典题也是所有二分变形题的基础吃透这道题就能掌握二分查找的核心框架后续的边界查找、真题实战都能以此为基础延伸。题目给定一个 n 个元素的有序、无重复整型数组 nums 和一个目标值 target写一个函数搜索 nums 中的 target。如果目标值存在返回其下标如果不存在返回 -1。题目链接LeetCode 704. 二分查找Java 代码class Solution { public int search(int[] nums, int target) { int left 0; int right nums.length - 1; while (left right) { int mid left (right - left) / 2; // 防止溢出替代(leftright)/2 if (nums[mid] target) { return mid; // 找到目标值直接返回下标 } else if (nums[mid] target) { left mid 1; // 目标值在右侧区间缩小左边界 } else { right mid - 1; // 目标值在左侧区间缩小右边界 } } return -1; // 循环结束仍未找到返回-1 } }关键点避坑重点循环条件 left right这里必须包含“等于”因为当left和right重合时当前位置的元素还未被判断若漏掉“等于”会导致该位置的目标值被遗漏出现查找失败的错误。mid 不要写成 (leftright)/2当left和right均为较大的整数如接近int类型的最大值时两者相加会超出int类型的取值范围导致数值溢出进而出现计算错误而left (right - left)/2 等价于 (leftright)/2却能有效避免溢出问题。区间更新必须是mid1/mid-1否则会死循环因为当nums[mid]不等于target时该位置已被排除若仅更新为leftmid或rightmid会导致区间无法缩小陷入无限循环例如left1、right2mid1若nums[mid]targetleft仍设为1区间始终不变。三、二分最重要的能力找边界在实际面试中单纯查找目标值的基础题占比极低更多的是变形题——找左边界、右边界、插入位置这类题目核心考察对区间收缩的精准控制也是二分查找的难点所在掌握这部分就能应对80%的二分变形题。1. 找左边界第一个等于 target 的位置适用场景数组中存在重复元素需要找到目标值第一次出现的位置例如数组[1,2,2,2,3]target2左边界为1。private int leftBound(int[] nums, int target) { int left 0; int right nums.length - 1; while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { left mid 1; // 目标在右侧左边界右移 } else { right mid; // 目标在左侧或当前位置右边界左移保留mid } } // 循环结束后leftright判断该位置是否为目标值 return nums[left] target ? left : -1; }2. 找右边界最后一个等于 target 的位置适用场景数组中存在重复元素需要找到目标值最后一次出现的位置例如数组[1,2,2,2,3]target2右边界为3。private int rightBound(int[] nums, int target) { int left 0; int right nums.length - 1; while (left right) { int mid left (right - left 1) / 2; // 向上取整避免死循环 if (nums[mid] target) { right mid - 1; // 目标在左侧右边界左移 } else { left mid; // 目标在右侧或当前位置左边界右移保留mid } } // 循环结束后leftright判断该位置是否为目标值 return nums[left] target ? left : -1; }记忆口诀快速掌握避免混淆找左边界mid 向下取整rightmid优先收缩右边界保留左侧可能的边界找右边界mid 向上取整leftmid优先收缩左边界保留右侧可能的边界循环条件一律用left right循环结束后left与right重合再判断是否为目标值避免边界遗漏。四、LeetCode 高频真题Java 版理论结合实战才是掌握二分的关键下面精选5道LeetCode高频真题覆盖边界查找、数值计算、旋转数组等常见场景每道题都附带详细解析和Java代码帮你巩固知识点应对面试实战。题目 1LeetCode 34 在排序数组中查找元素的第一个和最后一个位置这道题是左右边界查找的直接应用将前面讲解的左边界、右边界函数结合起来就能快速解题也是面试中最常考的边界类题目之一。class Solution { public int[] searchRange(int[] nums, int target) { // 先判断数组为空的特殊情况避免空指针异常 if (nums null || nums.length 0) return new int[]{-1, -1}; // 调用左边界、右边界函数获取两个边界下标 int left leftBound(nums, target); int right rightBound(nums, target); // 返回结果数组若目标值不存在两个边界均为-1 return new int[]{left, right}; } // 左边界查找函数复用前面的实现 private int leftBound(int[] nums, int target) { int left 0, right nums.length - 1; while (left right) { int mid left (right - left) / 2; if (nums[mid] target) left mid 1; else right mid; } return nums[left] target ? left : -1; } // 右边界查找函数复用前面的实现 private int rightBound(int[] nums, int target) { int left 0, right nums.length - 1; while (left right) { int mid left (right - left 1) / 2; if (nums[mid] target) right mid - 1; else left mid; } return nums[left] target ? left : -1; } }题目 2LeetCode 35 搜索插入位置这道题是左边界查找的变形核心需求是如果数组中存在target返回其下标如果不存在返回它应该被插入的位置保证插入后数组依然有序。解题关键是找到第一个大于等于target的位置即为插入位置。class Solution { public int searchInsert(int[] nums, int target) { int left 0; int right nums.length - 1; while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { left mid 1; // 目标在右侧左边界右移 } else { right mid; // 目标在左侧或当前位置保留mid收缩右边界 } } // 最后判断若当前元素小于target插入到当前位置后面否则插入到当前位置 return nums[left] target ? left 1 : left; } }题目 3LeetCode 69 x 的平方根这道题是二分查找在数值计算中的应用需求是求x的算术平方根只保留整数部分例如x8平方根是2.828返回2。核心思路是找到最大的整数mid使得mid² ≤ x这个mid就是x的算术平方根的整数部分。class Solution { public int mySqrt(int x) { // 特殊情况处理x1时算术平方根小于1整数部分为0 if (x 1) return 0; // 搜索区间1到x因为1的平方根是1x的平方根不大于x long left 1; long right x; while (left right) { // 向上取整避免死循环若向下取整可能导致left无法到达right long mid left (right - left 1) / 2; if (mid * mid x) { left mid; // mid满足条件尝试找更大的满足条件的数 } else { right mid - 1; // mid不满足条件缩小右边界 } } // 循环结束后leftright即为x的算术平方根的整数部分 return (int) left; } }题目 4LeetCode 852 / 162 山峰数组、寻找峰值这道题考察二分查找的核心本质——二段性而非数组有序。山峰数组的特点是前半部分严格递增后半部分严格递减峰值就是数组中最大的元素也是递增和递减的分界点利用这一二段性可快速用二分找到峰值。class Solution { public int peakIndexInMountainArray(int[] arr) { // 搜索区间1到arr.length-2峰值不可能在数组两端避免越界 int left 1; int right arr.length - 2; while (left right) { int mid left (right - left 1) / 2; // 若mid位置元素大于前一个元素说明在递增段峰值在右侧 if (arr[mid] arr[mid - 1]) { left mid; } else { // 否则在递减段峰值在左侧 right mid - 1; } } // 循环结束后leftright即为峰值下标 return left; } }题目 5LeetCode 153 寻找旋转排序数组中的最小值旋转排序数组是二分查找的经典变形场景这类数组是由有序数组旋转得到例如[0,1,2,4,5,6,7]旋转后得到[4,5,6,7,0,1,2]其依然具有二段性一部分是有序递增区间另一部分也是有序递增区间且前半段区间的所有元素都大于后半段区间的所有元素利用这一特点可快速找到最小值。class Solution { public int findMin(int[] nums) { int left 0; int right nums.length - 1; // 以数组最右侧元素为基准判断mid所在的区间 int x nums[right]; while (left right) { int mid left (right - left) / 2; // 若mid元素大于基准x说明mid在左半段较大元素区间最小值在右侧 if (nums[mid] x) { left mid 1; } else { // 否则mid在右半段较小元素区间最小值在左侧或当前位置 right mid; } } // 循环结束后leftright即为最小值下标 return nums[left]; } }五、二分查找核心总结必背二分的本质不是有序而是二段性这是最核心的知识点只要能将搜索区间明确划分为“满足条件”和“不满足条件”两部分且两部分边界清晰无论数组是否整体有序都能使用二分查找。循环条件核心区分找确定值如LeetCode 704left right需判断每一个位置的元素避免遗漏找边界/峰值/最小值如左右边界、山峰数组left right循环结束后left与right重合再判断该位置是否符合要求。mid 写法避坑关键向下取整left (right-left)/2适用于找左边界、确定值查找等场景向上取整left (right-left1)/2适用于找右边界、峰值等场景避免出现死循环。区间收缩灵活运用右移left mid 1当mid位置元素不满足目标条件且目标在右侧区间时使用左移right mid - 1当mid位置元素不满足目标条件且目标在左侧区间时使用保留 midleftmid或rightmid当mid位置元素可能是目标值如边界、峰值需要保留该位置继续查找时使用。六、学习建议先把704 基础二分写熟这是所有二分题的基础先熟练掌握基础模板理解循环条件、mid写法、区间收缩的逻辑不要急于刷难题再练34 左右边界左右边界是二分变形的核心多手推几遍区间变化过程理解“向下取整/向上取整”和“保留mid”的原因避免死记模板然后按顺序刷题35插入位置→ 69平方根→ 852山峰数组→ 153旋转数组最小值→ 162寻找峰值循序渐进巩固不同场景的应用每道题自己手推一遍区间变化不要死记模板二分的难点在于边界处理手推区间变化如left、right、mid的每次取值能快速理解收缩逻辑避免出错。最后提醒二分查找看似简单实则细节为王很多人刷题时出错不是不会模板而是忽略了边界条件和区间收缩的细节。只要理解区间怎么缩掌握二段性的核心所有二分题都是换汤不换药多练、多推、多总结就能轻松应对面试中的各类二分考点。

相关文章:

二分查找看这篇就够了!Java 版超详细讲解+高频题解

二分查找看这篇就够了!Java 版超详细讲解高频题解 大家好,今天我们来彻底吃透二分查找。作为算法面试、笔试中的“常青树”,它是必考且基础的核心知识点,看似只有“左右指针中间值对比”这一个简单逻辑,但实际应用中&a…...

CSDN格式 - 人工智能专业毕设和论文为什么难?无需代码也能讲明白

人工智能专业毕设/论文难在哪?无代码视角深度解析一、引言对于人工智能专业的学生而言,毕业设计与毕业论文往往被称为“大学最难关卡”。很多同学即便具备一定编码能力,依旧在毕设中举步维艰;甚至有不少人认为“AI毕设写代码”&am…...

金融级MySQL迁移实践:ComStar系统平滑替换的技术路径复盘

金融级MySQL迁移实践:ComStar系统平滑替换的技术路径复盘 在当前信创政策与安全合规双重驱动下,金仓数据库(KingbaseES)因其对MySQL生态的深度适配能力,正被证券、银行等金融机构纳入核心交易系统的替换评估范围。尤其…...

报名「养虾故事大会」赢取 Mac Mini!OpenClaw Demo Night

大家的虾,养了多久了? 这一次,我们想认真把大家聚在一起,在3月19日(周四)晚上19点,在北京朝阳望京,办一届「养虾故事大会」。 带上你的虾,show 出你做了什么&#xff0…...

为了让我爸使用 OpenClaw,我给它套上通话功能

我爸和众多中国老年人一样,其实已经是豆包的忠实用户了。 但作为一个 AI 博主,我内心总是想让老父亲知道 OpenClaw 的牛逼之处,让他开开眼。在家里给他演示一通后,他得出了个结论,软件不错,能控制很多东西…...

ClaudeCode武装三件套:Ghostty + Yazi + Lazygit 打造高效开发环境

引言:多终端切换之痛 在终端里深度使用 Claude Code 一段时间后,你很快会遇到一个现实问题: 场景:前后端需求同时开发,一个终端跑 Claude Code,另一个查看日志,还需要随时管理文件、提交代码……...

SEGGER的embOS也推出动态APP用法emApps

https://www.segger.com/products/virtualization/emapps/ 特点: 1、emApps将智能手机便捷灵活的应用生态引入嵌入式系统领域。作为固定固件的替代方案,emApps通过引入应用层,使开发者无需改动已验证的核心系统即可随时扩展新功能。 2、为实…...

AI产品经理核心能力全景图:从需求洞察到产品落地的全链路实战手册

AI产品经理核心能力全景图:从需求洞察到产品落地的全链路实战手册 摘要:本文基于AI产品经理核心能力模型,系统拆解五大核心模块:用户需求分析与场景挖掘、AI产品设计框架、MVP定义与验证、PRD文档撰写、用户体验优化。提供可直接…...

Prompt提示词设计工程:从原则到实战的系统性方法论(附模板与调试工具)

Prompt提示词设计工程:从原则到实战的系统性方法论(附模板与调试工具) 摘要:本文基于Prompt Engineering系统化知识框架,深度解析提示词设计的五大核心模块:从基本原则到少样本学习,从角色定义到…...

Course15:视觉大模型与多模态理解

Qwen 多模态模型中图片 Token ID 与向量的核心理解文本 Token 是 “语言的最小语义单元”,图片 Token 是 “视觉的最小特征单元”—— 两者最终都会被映射到同一维度的向量空间,让模型能 “读懂” 图文的关联语义。维度文本 Token(如 Qwen 的…...

为什么程序员群体正在疯狂安利DeepSeek-Coder?

最近打开CSDN、GitHub、技术交流群,有一个名字频繁刷屏——DeepSeek-Coder。不同于以往各类AI编程工具的“昙花一现”,这款工具几乎获得了从新手到资深工程师、从个人开发者到企业团队的一致认可,甚至出现了“人均安利”的盛况。作为每天与代…...

人形机器人行业日报 | 战场、月球、马斯克的新棋局

乌克兰前线:机器人士兵已上战场 乌克兰国家通讯社最新数据显示,今年1月份该国启动了 7495 次机器人作战行动。 大部分是后勤任务——给前线送武器、弹药、食物。但有意思的是,部分机器人已经配备了卡拉什尼科夫机枪和炸药,在前线…...

【高精度气象】一场暴雨影响多少赛事赞助?赛事保险正在依赖分钟级预报止损

对于赛事主办方而言,2026年的残酷现实是:一场突如其来的暴雨,不仅可能让数万观众扫兴而归,更可能让数百万赞助费付诸东流,让主办方面临天价索赔。但当分钟级预报与动态保险定价深度融合,一个全新的“天气止…...

【高精度气象】光伏运维的“清洗经济学”:精准辐照预报如何让每一块面板都在最佳时刻“吐纳”

2026年的春天,某光伏电站的运维经理王工,在手机屏幕上划动着一张特殊的“清洗地图”。地图上,原本需要全员出动、耗时两周的春季大清洗任务,被分解成数十个彩色区块。红色区块显示“辐照度即将达峰,建议今日优先清洗”…...

【新能源电站运维】运维无效出工减少30%、设备寿命延长3-5年:功率预测如何重构新能源场站成本结构?

2026年的春天,西北某光伏园区的运维班长张工,手机上没有收到往年的“春季大扫除”全员出动通知,取而代之的是一条来自功率预测系统的精准指令:“3月17日14:00,阵风达8级,建议优先加固7区、12区跟踪支架&…...

Java 面试题及答案整理(2026金三银四速成版)

又是一年金三银四 !纵观今年的技术招聘市场, Java 依旧是当仁不让的霸主 !即便遭受 Go 等新兴语言不断冲击,依旧岿然不动。究其原因:Java 有着极其成熟的生态,这个不用我多说;Java 在 运维、可观…...

吐血推荐! AI论文写作软件 千笔ai写作 VS PaperRed,专科生专属神器!

随着人工智能技术的迅猛迭代与普及,AI辅助写作工具已逐步渗透到高校学术写作场景中,成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生,开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…...

专科生也能用!千笔AI,碾压级的AI论文工具

你是否曾为论文选题发愁,反复修改却仍不满意?是否在查重和格式上耗费大量时间,却收效甚微?对于专科生来说,论文写作不仅是学术挑战,更是心理压力的来源。面对繁杂的文献、复杂的格式要求和严格的查重标准&a…...

别再瞎找了!10个AI论文软件测评:全学科适配,开题报告+毕业论文全搞定

在学术研究日益数字化的今天,论文写作已成为高校师生和科研人员不可回避的核心任务。然而,从选题构思到文献检索、从初稿撰写到格式调整,每一个环节都可能成为效率的“卡点”。尤其在AI技术快速迭代的背景下,市场上涌现出大量论文…...

干货来了:本科生专属降AI率平台,千笔·专业降AI率智能体 VS 锐智 AI

在AI技术迅速发展的今天,越来越多的本科生开始借助AI工具辅助论文写作,以提高效率、优化内容。然而,随着学术审核标准日益严格,AI生成内容的痕迹越来越容易被检测出来,导致论文AI率超标成为普遍难题。许多学生在反复修…...

从此告别拖延 10个降AIGC平台全场景通用测评与推荐

在学术写作和论文创作过程中,AI生成内容的痕迹往往成为困扰作者的一大难题。随着AIGC(人工智能生成内容)技术的广泛应用,如何有效降低论文中的AI痕迹、提升原创性,已成为众多学生、研究人员乃至专业写作者的共同需求。…...

揭开Airsim仿真自动UAV巡航无碰撞源码的神秘面纱

DL00403-Airsim仿真自动UAV巡航无碰撞源码实现在无人机(UAV)的开发领域,Airsim仿真平台为我们提供了一个绝佳的测试与开发环境。今天咱们就来聊聊DL00403这个自动UAV巡航无碰撞源码实现的事儿。 前期准备与环境搭建 Airsim基于虚幻引擎&#…...

深度解析检索增强三核心:普通RAG、GraphRAG与NL2SQL

在大模型应用落地过程中,“幻觉”“知识过时”“无法对接业务数据”是三大核心痛点——大模型虽具备强大的自然语言理解与生成能力,但自身知识库固定(无法实时更新)、缺乏逻辑推理能力(尤其多跳关系)、无法…...

副业收益追踪器,记录时间投入与收入,自行算时薪,判断副业是否值得坚持。

副业收益追踪器 - 时薪计算与价值评估系统一、实际应用场景描述场景:小王是一名前端开发工程师,利用晚上和周末接私活、写技术博客、做线上课程。一个月下来,他接了3个外包项目(共收入15000元),写了2篇技术…...

_Device_Node中的ResourceList和ResourceListTranslated和BootResources

_Device_Node中的ResourceList和ResourceListTranslated和BootResources0: kd> dt _Device_Node 0x899c1008 nt!_DEVICE_NODE0x000 Sibling : (null)0x004 Child : 0x899875a8 _DEVICE_NODE0x008 Parent : 0x899c5850 _DEVICE_NODE0x00c La…...

金三银四Java 岗面试清单:分布式 +Dubbo+ 线程 +Redis+ 数据库 +JVM+ 并发

最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题。我大概是分成了 Java 基础、中级、高级,分布式,Spring 架构,多线程,网络,MySQL,Redis 缓存,JVM 相关&#xf…...

Java8 HashMap高低位拆分扩容,核心逻辑一次性说清

一、Jdk7 1、扩容死锁分析 死锁问题核心在于多线程扩容导致形成的链表环 void transfer(Entry[] newTable, boolean rehash) {int newCapacity newTable.length;for (Entry<K,V> e : table) {while(null ! e) {//第一行Entry<K,V> next e.next;if (rehash) {e…...

功率波动平抑:从算法到并网标准验证

平抑功率波动&#xff0c;一分钟功率波动和十分钟功率波动 1、1min和10min满足国家并网标准 2、先用滑动平均算法或卡尔曼滤波算法进行平抑 3、求解平抑后是否满足国家并网标准 4、程序注释很详细。 有步骤的在电力系统中&#xff0c;确保功率稳定输出至关重要&#xff0c;而平…...

信息化建设-核心系统实施方法论

4.2 核心系统实施方法论4.2.1 核心系统实施的理论定位核心系统实施是企业信息化建设从规划走向现实的关键一步&#xff0c;其理论任务是将选定的软件产品通过科学的实施方法&#xff0c;成功部署到企业环境中&#xff0c;实现预期的业务价值。无论是采购成熟软件还是自研开发&a…...

信息化建设-实施路径规划与投资预算

3.5 实施路径规划与投资预算3.5.1 实施路径规划的理论价值实施路径规划是信息化建设从蓝图到现实的“施工计划”&#xff0c;其理论任务是将整体架构设计分解为可执行、可管理、可验证的阶段任务&#xff0c;明确每个阶段的目标、范围、时间、资源和预算&#xff0c;确保信息化…...