news 2026/7/13 17:18:55

二分查找算法精讲:边界条件与变体问题(左闭右闭 vs 左闭右开)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分查找算法精讲:边界条件与变体问题(左闭右闭 vs 左闭右开)

一.算法描述

二.算法实现

package com.algorithm.binarysearch; public class BinarySearch { /*params:a - 待查找的升序数组 target - 待查找的目标值 Returns: 找到则返回索引 找不到则返回-1 * */ public static int binarySearch(int[] a,int target){//设置元素个数数组和待查找的目标值 int i = 0,j = a.length - 1;//设置指针和初值 while(i<=j){ int m = (i+j) >>> 1; //用无符号右移运算符,防止溢出 if(target < a[m]){//目标值在中间值左边的情况下 j = m - 1; }else if(target >a[m]){//目标值在中间值右边的情况下 i = m + 1; }else { return m; //找到中间值 } } return -1;//找不到的情况下返回-1 } }
package com.algorithm.binarysearch; public class BinarySearch { /*params:a - 待查找的升序数组 target - 待查找的目标值 Returns: 找到则返回索引 找不到则返回-1 * */ public static int binarySearch(int[] a,int target){//设置元素个数数组和待查找的目标值 int i = 0,j = a.length;//设置指针和初值 while(i<j){ int m = (i+j) >>> 1; //用无符号右移运算符,防止溢出 if(target < a[m]){//目标值在中间值左边的情况下 j = m; }else if(target >a[m]){//目标值在中间值右边的情况下 i = m + 1; }else { return m; //找到中间值 } } return -1;//找不到的情况下返回-1 } }

三.查找问题

问题一

q:为什么是i<=j意味着区间内有未比较元素,而不是i<j?

s:i,j 它们指向的元素也会参与比较。

问题二

q:(i+j)/2有没有问题?

s:同一个二进制数,在java中会把第一位看作符号位,所以用">>>"无符号右移运算符,防止溢出。

问题三

q:在比较中写成“<”小于符号有何好处?

s:数组是升序排列的,写成小于符号可以是和数组升序排列方向一致,不然会很别扭。

四.如何判断算法好坏

1.时间复杂度

含义:是用来衡量一个算法的执行,随数据规模增大,而增长的时间成本。

2.如何表示时间复杂度

假设算法要处理的数据规模是n,代码总的执行行数用函数f(n)来表示,例如:

  • 线性查找算法的函数f(n) = 3*n+3
  • 二分查找算法的函数f(n) = (floor(log2(n)+1)*5+4

渐进上界:代表算法执行的最差情况

渐进下界:代表算法执行的最好情况

渐进紧界:既能代表算法执行的最好情况,也能代表算法执行的最差情况

3.常见的大O表示法

4.空间复杂度

与时间复杂度类似,一般也是用大O表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本。

5.二分查找性能

五.插入数组

将数组中没有的元素插入进去

六.寻找最侧边元素

1.寻找最左侧元素

package com.algorithm.binarysearch; public class BinarySearch { /*params:a - 待查找的升序数组 target - 待查找的目标值 Returns: 找到则返回索引 找不到则返回-1 * */ public static int binarySearch(int[] a,int target){ int i = 0,j = a.length - 1; int candidate = -1//表示没有任何候选者 while(i<=j){ int m = (i+j) >>> 1; if(target < a[m]){ j = m - 1; }else if(target >a[m]){ i = m + 1; }else { //记录侯选位置 condidate = m; j = m - 1; } } return -1; }

2.寻找最右侧元素

package com.algorithm.binarysearch; public class BinarySearch { /*params:a - 待查找的升序数组 target - 待查找的目标值 Returns: 找到则返回索引 找不到则返回-1 * */ public static int binarySearch(int[] a,int target){ int i = 0,j = a.length - 1; int candidate = -1//表示没有任何候选者 while(i<=j){ int m = (i+j) >>> 1; if(target < a[m]){ j = m - 1; }else if(target >a[m]){ i = m + 1; }else { //记录侯选位置 condidate = m; i = m + 1; } } return condidate; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 17:18:21

OpenRGB终极解决方案:用一个开源工具统一控制所有RGB设备

OpenRGB终极解决方案&#xff1a;用一个开源工具统一控制所有RGB设备 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Rel…

作者头像 李华
网站建设 2026/7/13 17:16:58

Deep-Live-Cam终极指南:3分钟掌握实时AI换脸技术

Deep-Live-Cam终极指南&#xff1a;3分钟掌握实时AI换脸技术 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam 想要在直播、视频会议或内容…

作者头像 李华
网站建设 2026/7/13 17:15:37

AI设计工具如何同时生成原型和UI界面?主流平台盘点

AI 设计工具已能够在同一工作流内同时生成原型和 UI 界面&#xff0c;其中首推 UXbot——这是目前唯一能在一次操作中完成流程规划、多页面可交互原型生成和前端代码导出的 AI 全链路工具&#xff0c;无需在独立原型工具和 UI 工具之间切换。根据 Grand View Research 原型设计…

作者头像 李华
网站建设 2026/7/13 17:09:39

逆向工程驱动兼容性:3步让老Mac焕发新生

逆向工程驱动兼容性&#xff1a;3步让老Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一个基于Python的开源项目&…

作者头像 李华