Binary Search 方法题型汇总
作为log(n) search 方法的典型, Binary Search基本可以分为以下几类
- - Search 准确number的
- -Search 最小differnece的
- -Search closest的,这个又可以分为略微小于和略微大于的。
- Search min or max
- 有重复的
- 非单项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.
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); }