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