算法-二分查找2

Posted java程序员笔记

tags:

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

如何快速定位IP对应的省份

二分查找的四种变形:查找第一个值等于给定值得元素,查找最后一个值等于给定值得元素,查找第一个大于等于给定值得元素,查找最后一个小于等于给定值得元素。

同时,今天的这四种情况,给定数据集合同样是有序的,但是却有重复元素。

变体一:查找第一个值等于给定值得元素

先看代码:

 
   
   
 
  1.    public static int searchOne(int[] list,int num){

  2.        int low = 0;

  3.        int high = list.length - 1;

  4.        while(low <= high){

  5.            int mid = (high + low)/2;

  6.            if(list[mid] > num){

  7.                high = mid - 1;

  8.            }else if(list[mid] < num){

  9.                low = mid + 1;

  10.            }else{

  11.                if(list[mid] == num && list[mid - 1] < num){

  12.                    return mid;

  13.                }else{

  14.                    high = mid - 1;

  15.                }

  16.            }

  17.        }

  18.        return -1;

  19.    }

上述代码中,对于 list[mid] 大于或者小于给定值的判断逻辑很好理解,重点解释下 list[mid] 等于给定值的时候如何做出判断。

当 list[mid] 等于给定值得时候,因为数组是按照从小到大顺序排列,所以我们要根据 mid 前一位的值做出后续的逻辑判断。如果 list[mid - 1] 小于给定值,则证明 mid 位置上是第一个给定值的元素,否则就需要令 high = mid - 1,继续二分查找。

变体二:查找最后一个值等于给定值得元素

先看代码:

 
   
   
 
  1.    //二分法查找变体二,查找最后一个值等于给定值得元素

  2.    public static int searchTwo(int[] list,int num){

  3.        int low = 0;

  4.        int high = list.length - 1;

  5.        while(low <= high){

  6.            int mid = (high + low)/2;

  7.            if(list[mid] > num){

  8.                high = mid - 1;

  9.            }else if(list[mid] < num){

  10.                low = mid + 1;

  11.            }else{

  12.                if(list[mid] == num && list[mid + 1] > num){

  13.                    return mid;

  14.                }else{

  15.                    low = mid + 1;

  16.                }

  17.            }

  18.        }

  19.        return -1;

  20.    }

当 list[mid] 等于给定值得时候,因为数组是按照从小到大顺序排列,所以我们要根据 mid 前一位的值做出后续的逻辑判断。如果 list[mid + 1] 大于给定值,则证明 mid 位置上是最后一个给定值的元素,否则就需要令 low = mid + 1,继续二分查找。

变体三:查找第一个值大于给定值得元素

先看代码:

 
   
   
 
  1.    //二分法查找变体三,查找第一个值大于给定值得元素

  2.    public static int searchThree(int[] list,int num){

  3.        int low = 0;

  4.        int high = list.length - 1;

  5.        while(low <= high){

  6.            int mid = (high + low)/2;

  7.            if(list[mid] > num){

  8.                high = mid - 1;

  9.            }else if(list[mid] < num){

  10.                low = mid + 1;

  11.            }else{

  12.                if(list[mid] == num && list[mid + 1] > num){

  13.                    return mid + 1;

  14.                }else{

  15.                    low = mid + 1;

  16.                }

  17.            }

  18.        }

  19.        return -1;

  20.    }

当 list[mid] 等于给定值得时候,因为数组是按照从小到大顺序排列,所以我们要根据 mid 前一位的值做出后续的逻辑判断。如果 list[mid + 1] 大于给定值,则证明 mid + 1 位置上第一个值大于给定值得元素,否则就需要令 low = mid + 1,继续二分查找。

变体四:查找第一个值小于给定值得元素

先看代码:

 
   
   
 
  1.    //二分法查找变体四,查找第一个值小于给定值得元素

  2.    public static int searchFour(int[] list,int num){

  3.        int low = 0;

  4.        int high = list.length - 1;

  5.        while(low <= high){

  6.            int mid = (high + low)/2;

  7.            if(list[mid] > num){

  8.                high = mid - 1;

  9.            }else if(list[mid] < num){

  10.                low = mid + 1;

  11.            }else{

  12.                if(list[mid] == num && list[mid - 1] < num){

  13.                    return mid - 1;

  14.                }else{

  15.                    high = mid - 1;

  16.                }

  17.            }

  18.        }

  19.        return -1;

  20.    }

当 list[mid] 等于给定值得时候,因为数组是按照从小到大顺序排列,所以我们要根据 mid 前一位的值做出后续的逻辑判断。如果 list[mid - 1] 小于给定值,则证明 mid - 1 位置上第一个值大于给定值得元素,否则就需要令 high= mid - 1,继续二分查找。

如何快速定位IP对应的省份

总结

本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。

初入算法学习,必是步履蹒跚,一路磕磕绊绊跌跌撞撞。看不懂别慌,也别忙着总结,先读五遍文章先,无他,唯手熟尔~ 与诸君共勉

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

查找算法——二分查找

算法-二分查找2

常见算法之二分查找

leetcode查找算法(顺序查找,二分法,斐波那契查找,插值查找,分块查找)

二分查找算法

Java二分查找算法复制粘贴直接用