二分查找变种
该算法有很多版本,这里给出java中实现比较好的一种方式。其中,>>>
为无符号右移。
二分查找第一个值为obj的元素
/**
* 二分查找第一个值为obj的元素
* @param array
* @param obj
* @return 若数组为空,返回-1; 若查找到,则返回其索引; 若未查找到,返回负值(可能为-1)
*/
public static int binarySearchFirstEqual (int[] array, int obj) {
if (array == null || array.length == 0) {
return -1;
}
int left = 0;
int right = array.length - 1;
while (left < right) {
int mid = left + ((right - left) >>> 1);
if (array[mid] < obj) {
left = mid + 1;
} else {
right = mid;
}
}
if (array[left] == obj) {
return left;
}
return -(left + 1); // 参照官方文档自定义值
}
二分查找最后一个值为obj的元素
/**
* 二分查找最后一个值为obj的元素
* @param array
* @param obj
* @return 若数组为空,返回-1; 若查找到,则返回其索引; 若未查找到,返回负值(可能为-1)
*/
public static int binarySearchLastEqual (int[] array, int obj) {
if (array == null || array.length == 0) {
return -1;
}
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = left + ((right - left) >>> 1);
if (array[mid] <= obj) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (right >= 0 && array[right] == obj) {
return right;
}
return -(right + 1); // 参照官方文档自定义值
}
比较好的文章
『注:本文来自博客园“小溪的博客”,若非声明均为原创内容,请勿用于商业用途,转载请注明出处http://www.cnblogs.com/xiaoxi666/』
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性