整数二分步骤:
1.找一个区间[L,R],使答案一定在这个区间
2.找一个判断条件,使得该判断条件具有二段性(一般具有单调性),并且答案一定是该二段性的分界点
3.分析终点M在该判断条件下是否成立,如果成立,考虑答案在哪个区间,如果不成立,考虑答案在哪个区间
4.如果更新方式写的是R = Mid,则不用做如何处理,如果更新方式写的是L = Mid,则需要在计算Mid时加上1
核心操作:
while(r-l > 10e-7)
{int mid = l+r+1>>1;if (check(mid)){l = mid;}else{r = mid-1;}
}while (r-l > 10e-7)
{int mid = l+r>>1;if (check(mid)){r = mid;}else{l = mid+1;}
}
例子:
LeetCode 35:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
代码如下:
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size();while(left < right){int mid = (left+right)>>1;if (nums[mid] >= target)right = mid;else left = mid+1;}return right;}
};