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

猜你喜欢

转载自www.cnblogs.com/xiaobaicaigarden/p/10247890.html