二分 : 存在一种两段性的性质,就可以进行二分(最常见的就是单调性)
流程 :
1.确定二分边界
2.编写二分框架
3.设计一个check性值
4.判断一下区间如何更新
5.如果更新方式写的是l = mid, r = mid - 1, 那么就在算mid时加上1
1.
1 | int mySqrt(int x) { |
2.
1 | int mySqrt(int x) { |
3.
设t为区间[l, r]中的一个元素, 那么 我们要找到一个t, 他的t * t = x
1 | int mySqrt(int x) { |
…
34. Find First and Last Position of Element in Sorted Array
1 | class Solution { |
以[5, 7, 7, 8, 8, 10]为例
- 找二段性,按 t >= 8 可以分成两段 (这样划分,二分查找完成后得到的是第一个>= 8 的元素)
if (nums[mid] >= target) 这时, 我们要找的点(第一个 >= 8 的元素)在mid的左边,也可能是mid, 所以 r = mid;

- 同理, 我们要找第一个 <= 8的元素, 如果nums[mid] <= 8, 那么此时这个点就在mid的右侧, 也可能是 mid, 所以 l = mid;

74. Search a 2D Matrix
1 | class Solution { |
n = matrix.size(), m = matrix[0].size()
行号 i = k / m (下取整)
列号 j = k mod m
153. Find Minimum in Rotated Sorted Array
1 | class Solution { |
back()
返回当前vector容器中末尾元素的引用。
front()
返回当前vector容器中起始元素的引用。

找二段性的位置, 即后半部分满足, 前半部分不满足的——后半部分的元素 小于等于 末尾元素。 结合图片可知, 最小元素即黄色点 就是小于等于 末尾元素的第一个点
278. First Bad Version
1 | // Forward declaration of isBadVersion API. |
162. Find Peak Element
1 | class Solution { |
287. Find the Duplicate Number
1 | class Solution { |