二分查找-变种

Posted Java开挂记录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找-变种相关的知识,希望对你有一定的参考价值。

最简单的二分查找

图片分析

解释:

  1. 假设要查找的数字是6(value)

  2. 定义要查找数组的边界值,首先找到数组的中间值下标

  3. 如果小于value,说明要找的值在右边将数组最小值设为:中间值+1

  4. 依次类推直至找到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行注释


以上是关于二分查找-变种的主要内容,如果未能解决你的问题,请参考以下文章

二分法——二分查找的变种

二分查找以及变种的总结

手撕二分查找及其变种,就是干!

二分查找及其变种大全详解

二分查找(Binary Search)的几种变种形式

面试前必知必会的二分查找及其变种