zoukankan      html  css  js  c++  java
  • Binary Search 方法题型汇总

     作为log(n) search 方法的典型, Binary Search基本可以分为以下几类

    1. - Search 准确number的
    2. -Search 最小differnece的
    3. -Search closest的,这个又可以分为略微小于和略微大于的。
    4. Search min or max
    5. 有重复的
    6. 非单项sorted的

    下面逐个解说:

    1. 准确number, 这个比较简单,就是可以分为3中情况,mid等于,mid小于,mid大于。不赘述,具体code如下

    public bool BinarySearch(int[,] matrix, int row, int target, int left, int right)
        {
            if(left> right) return false;
            int mid = left + (right - left)/2;
            if(matrix[row,mid] == target) return true;
            else if(matrix[row,mid] > target) return BinarySearch(matrix, row,target, left, mid-1);
            else return BinarySearch(matrix, row,target, mid+1, right);
        }

    几个典型的题为

    2.

    3.

    First Bad Version

    public int BS(int[,] matrix, int target, int left, int right)
        {
            if(matrix[0,0]>target) return 0;
            if(left> right) return right;
            int mid = left+(right-left)/2;
            if(matrix[mid,0]>target) return BS(matrix,target, left, mid-1 );
            else return BS(matrix, target, mid+1, right);
        }

    以找第一个小于的值为例,几个要点,首先需要判断初始值符合不符合。比如最左边的也大于,那最小值就是最左边。

    Search过程中,conditional是left大于right而不是left大于等于right。这个的原因是因为存在left = n, right = n+1的情况,这种情况下mid永远是n,这就要求我们必须在递归的时候必须mid加1或者减1。

    比如找[1,4]中的第一个小于2 的值,

    left   mid  right      mid的值小于target,那么mid+1

    0        0      1

    1        1      1        这个时候如果判断条件是left >= right, 则直接输出为2,显然是不对的。所以当left == right时候继续判断。大于target, 那么mid-1

    1        0      0        left大于right,所以说输出left。

    5. 每次先check左右是否重复,如果有重复的,那就left加1或者right-1,继续Binary Search。

    Find Minimum in Rotated Sorted Array II

     public int FirstBadVersion(int left, int right)
        {
            if(left>=right) return left;
            int mid = left+(right - left)/2;
            if(IsBadVersion(mid)) return FirstBadVersion(left,mid);
            else return FirstBadVersion(mid+1,right);
        }

    6.

    Find Minimum in Rotated Sorted Array

    public int FindMin(int[] nums, int left, int right)
        {
            if(left>=right) return nums[left];
            int mid = left + (right - left)/2;
            if(nums[mid]> nums[right])    return FindMin(nums,mid+1,right);
            else return FindMin(nums,left, mid);
        }

    Search 2D Matrix II

  • 相关阅读:
    移动 App 接入 QQ 登录/分享 图文教程
    Word 最后一页无法删除-解决办法
    Java快速入门-04-Java.util包简单总结
    Java快速入门-03-小知识汇总篇(全)
    SSM 框架-06-详细整合教程(IDEA版)(Spring+SpringMVC+MyBatis)
    二叉树的镜像
    浅析I/O模型及其设计模式
    远程方法调用(RMI)原理与示例
    树的子结构
    合并两个排序的链表
  • 原文地址:https://www.cnblogs.com/renyualbert/p/6003509.html
Copyright © 2011-2022 走看看