- 单调性问题
- 存在着两段性的性质,即一半满足某一个性质,另一半不满足某个性质。
均可以使用二分查找。

红色表示满足某一个性质,绿色表示不满足某一个性质。
模板一
求红色的右边界情况。
if mid in 红 [L,R]->[M,R] L=M
else mid in 绿 [L,R]->[L,M-1] R=M-1
注意,mid应该是取(L+R)/2+1,防止死循环
1 | while(l<r){ |
模板二
求绿色的左边界情况
if mid in 绿 [L,R]->[L,M] R=M
else mid in 红 [L,R]->[M+1,R] L=M+1
mid取值是(L+R)/2
1 | while(l<r){ |
二分流程
确定二分边界:left = 0,right=x
编写二分代码框架
设定一个性质
判断区间如何更新
如果更新方式是l=mid,r=mid-1,那么mid上取整
69.求开方
按照框架来做:
设定一个性质:t*t<=x
区间如何更新:满足区间的右边界点
1 |
|
35.搜索插入位置?
边界判断
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
1 | public int searchInsert(int[] nums, int target) { |
34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置.
1 | public int[] searchRange(int[] nums, int target) { |
74.搜索二维矩阵
1 | //check:nums[mid]<=target 左侧边界值 |
162.寻找峰值
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
1 | /** |
基本的二分查找
搜索一个数。
1 | public int binarySearch(int [] arr,int val){ |
744.寻找比目标字母大的最小字母
1 | //check:letters[mid]<=target 右侧边界 |
540.有序数组的 Single Element
1 | /** |
153.旋转数组的最小数字?
1 | /** |