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

  • 相关阅读:
    NPOI操作EXCEL
    几个英文的数学概念
    C#中将鼠标光标变为忙碌状态
    C#使用Linq to Sqlite
    SSM-SpringMVC-25:SpringMVC异常顶级之自定义异常解析器
    SSM-SpringMVC-24:SpringMVC异常高级之自定义异常
    SSM-SpringMVC-23:SpringMVC中初探异常解析器
    SSM-SpringMVC-22:SpringMVC中转发(forward)和重定向(redirect)
    SSM-SpringMVC-21:SpringMVC中处理器方法之返回值Object篇
    jQuery-01:on live bind delegate
  • 原文地址:https://www.cnblogs.com/renyualbert/p/6003509.html
Copyright © 2011-2022 走看看