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

  • 相关阅读:
    使用Python连接redis(redis作MQ使用)_Tister的空间_百度空间
    LTTng 2.0 Downloads | LTTng Project
    How to capture stdout in realtime with Python « SaltyCrane Blog
    python的线程锁机制_dominic_80ChinaUnix博客
    Collective Intelligence实战/阿拉克(Satnam Alag)图书卓越亚马逊 [集体智慧编程]
    查IP
    沃尔玛控股中国1号店
    HeidiSQL MySQL made easy
    groovy学习7groovy sql 雪霁霜飞 博客园
    数据集 (DataSet) groovy
  • 原文地址:https://www.cnblogs.com/renyualbert/p/6003509.html
Copyright © 2011-2022 走看看