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

原文地址:https://www.cnblogs.com/renyualbert/p/6003509.html