二分查找-变种
Posted Java开挂记录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找-变种相关的知识,希望对你有一定的参考价值。
最简单的二分查找
图片分析
解释:
假设要查找的数字是6(value)
定义要查找数组的边界值,首先找到数组的中间值下标
如果小于value,说明要找的值在右边将数组最小值设为:中间值+1
依次类推直至找到value相等的下标,或者最大最小指针指向一个下标停止
代码实现
public static int search(int [] items,int value){
int low = 0;
int high = items.length-1;
while (low <= high){
//获取中间值:类似于(low+high)/2
int mid = low + ((high - low) >> 1);
if (items[mid] > value){
high = mid - 1;
}else if (items[mid] < value){
low = mid +1;
}else {
return mid;
}
}
return -1;
}
上面是最简单的二分查找,单只能单纯的判断是否存在value,如果数组存在多个value,比如要查找第一个相等的下标,这个就有的不好使了:{1,2,3,4,4,4,6,7,8}这个数组返回的下标就是4,而实际我们想要的是3
变种1:查找第一个相等的下标
/**
* 第一个与查找值相等的值
* 设置两个指针分别指向数组收尾
* 获取数组中间值,跟value做对比,如果小于中间值说明在中间值左侧,反之在右侧
* @param items
* @param value 要查找的数
* @return
*/
public static int lSearch(int [] items,int value){
//指定指针分别指向数组首位
int low = 0;
int high = items.length-1;
//低位不能大于高位
while (low <= high){
//获取中间值:类似于(low+high)/2
int mid = low + ((high-low) >> 1);
//如果中间值大于等于value则将最高值设为中间值-1
//要取第一个相等的,,所以相等的情况还要继续往前查找
if (items[mid] >= value){
high = mid-1;
}else {
low = mid+1;
}
}
//如果要找第一个大于等于的值:去掉 items[high] == value就可以
if (low < items.length && items[low] == value){
return low;
}
return -1;
}
变种2:查找最后一个相等的下标
/**
* 查找最后一个相等的下标
* @param items
* @param value
* @return
*/
public static int rSearch(int [] items,int value){
int low = 0;
int high = items.length-1;
while (low <= high){
int mid = low + ((high - low) >> 1);
//如果小于等于说明在右边,将最小值设为mid+1
if (items[mid] <= value){
low = mid + 1;
}else {
high = mid - 1;
}
}
//如果要找最后一个小于等于的值:去掉 items[high] == value就可以
if (high <= items.length && items[high] == value){
return high;
}
return -1;
}
变种3:查找最后一个小于等于的值,查找第一个大于等于的值
上面两个变种的19行和25行注释
以上是关于二分查找-变种的主要内容,如果未能解决你的问题,请参考以下文章