1. 程式人生 > >Binary Search 二分法方法總結

Binary Search 二分法方法總結

Binary Search 二分法方法總結

code教你做人:二分法核心思想是把一個大的問題拆成若干個小問題,最重要的是去掉一半或者選擇一半。

二分法模板: 

 1 public int BinarySearchTemplate(int[] nums,int target) {
 2         if(nums == null || nums.length == 0) return -1;
 3         int lo = 0;
 4         int hi = nums.length - 1;
 5         
 6         //A: lo < hi [1,2]找1 找last position會死迴圈
7 //B: lo <= hi 8 //C: lo + 1 < hi 9 //lo + 1 < hi 相鄰就要退出迴圈,lo = 1,hi = 2 10 while(lo + 1 < hi) { 11 int mid = lo + (hi - lo) / 2; 12 if(nums[mid] == target) 13 return mid; 14 else if(nums[mid] < target) {
15 lo = mid; 16 //hi = mid - 1 also works,但是不+1/-1更好記 17 } 18 else { 19 hi = mid; 20 //lo = mid + 1 also works 21 } 22 } 23 //lo + 1 < hi 方法需要在結尾判斷lo和hi 24 if(nums[hi] == target) return
hi; 25 if(nums[lo] == target) return lo; 26 27 return -1; 28 }

兩種型別題:

1.有序數列找特定值

【1】找target的下標,可能有重複,返回任意符合條件的index,無則return -1。

【2】返回target第一次出現的下標,可能有重複,無則return -1。

【3】返回trage最後一次出現的下標,可能有重複,無則return -1。(出現死迴圈的可能性很高 = > lo + 1 < hi 代替)

2.OOOOOOOXXXXXXXXXX 找圈圈叉叉的分割線

【1】找最後一個O

【2】找第一個X

結論:

1.+1不會對結果造成影響,只需要在最後只剩兩個數的時候進行判斷即可。

2.二分法的目的不是為了找到答案,而是為了縮小區間,從有限的候選中找出答案。

相關題目:

33. Search in Rotated Sorted Array

34. Find First and Last Position of Element in Sorted Array

35. Search Insert Position

74. Search a 2D Matrix

81. Search in Rotated Sorted Array II

153. Find Minimum in Rotated Sorted Array

154. Find Minimum in Rotated Sorted Array II

162. Find Peak Element

240. Search a 2D Matrix II

278. First Bad Version

354. Russian Doll Envelopes

528. Random Pick with Weight

852. Peak Index in a Mountain Array