二分法 - wenzhoullq/leetcode GitHub Wiki
模板
二分题目的题眼为:大于等于X的最小值,小于等于x的最大值,大于等于x的最小值的下标最大值,小于等于x的最大值的下标最小值,当然也存在大于x的最大值(旋转数组找临界点);
二分一般有开区间,闭区间和半开半闭区间三种写法,如int[] nums = {1,2,3,4,5,6},开区间是指left = -1 ,right = nums.length,闭区间是指left = 0 ,right = nums.length - 1;这里仅讨论开区间写法,开区间的最大好处在于不用记忆mid + 1 或则 mid - 1;
int left = -1, right = nums.length ;
while(left + 1 < right){
int mid = (right - left)/2 + left ;
if(nums[mid] > target) left = mid;
else right = mid ;
}
return right;
如模板所示,left最后一定是停在target的左边,而right一定停在target上(如果target存在),因此是找到大于等于target的最小值;一般模板固定为这个模板,具体查找的值要求变化则是通过改变查找值和下标,或则改return
入门学习题
最值
1870. 准时到达的列车最小时速 double有坑
最大值最小化/最小值最大化
二分+BFS
图的二分尽量别用二分,很容易tle