Binary Search 二分法方法總結
阿新 • • 發佈:2019-01-10
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) returnhi; 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