边界的二分搜索算法
用例:在递增数组arr中寻找大于等于target
的最小元素索引
思路:利用双指针,采用二分法查找左边界
代码:
public static int left_bound(int[] arr, int target){ if (arr.length == 0) return -1; int left = 0; int right = arr.length - 1; while(left<right){ int mid = left + (right - left ) / 2; if(arr[mid] == target ){ right = mid; }else if (arr[mid] < target){ left ++; }else if (arr[mid] > target){ right = mid; } } return left; } public static void main(String[] args) { int[] arr = new int[]{1,2,4,6,7,8,8,8,8,9,10,16,19}; int index = left_bound(arr, 8); System.out.println(index);
//输出 5 }
解读:
当目标元素target
不存在数组arr
中时,搜索左侧边界的二分搜索的返回值可以做以下几种解读:
1、返回的这个值是arr
中大于等于target
的最小元素索引。
2、返回的这个值是target
应该插入在arr
中的索引位置。
3、返回的这个值是arr
中小于target
的元素个数。
比如在有序数组arr= [2,3,5,7]
中搜索target = 4
,搜索左边界的二分算法会返回 2,你带入上面的说法,都是对的。
所以以上三种解读都是等价的,可以根据具体题目场景灵活运用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)