二分法是在一个排好序的序列(数组,链表等)中,不断收缩区间来进行目标值查找的一种算法,下面我们就来探究二分法使用的一些细节,以及常用的场景:
- 寻找一个数;
- 寻找左侧边界;
- 寻找右侧边界。
一、二分法的通用框架
int binarySearch(vector<int>& nums, int target){
int left=0, right=nums.size();
while(left < right)
{
int mid=(left+right)/2;
if(nums[mid] == target){
// 条件一:中间的值与目标值相同
}
else if(nums[mid] > target){
// 条件二:中间的值大于目标值
}
else if(nums[mid] < target){
// 条件三:中间的值小于目标值
}
}
return -1;
}
首先,我们先来分析一下右边界 right 的初始值:
- 当 right=nums.size() 时,初始化的区间就变成了 [0,right−1],即 [0,right);
- 当right=nums.size()-1 时,初始化的区间就变成了 [0,right]。
在第一种情况下,当 nums[mid] > target 时,需要将区间向左收缩,即 right&#