整数二分的基本思想
一般针对的是可以通过一分为二的思想将整个区间分成两块,这是最核心的思想,例如在有序序列中查找某个值,其实这种题目中数字有重复的话,也可以求出该数字出现的个数,通过二分找出左端点的下标,再通过二分找出右端点的下标。r - l + 1就是结果。
整数二分的两种做法
出现两种做法的原因是防止出现死循环
方案1
int find(int n, vector<int> vec)
{
int l = 0, r = vec.size() - 1;
while(l < r)
{
int mid = l + r >>1;
if(vec[mid] > n) r = mid;
else l = mid + 1;
}
return l;
}
此处注意int mid = l + r >> 1,,因为如果int mid = l + r + 1 >> 1,可能会导致死循环,导致r的值一直不变,记住一点,r = mid时, int mid = l + r >> 1;
方案二
int find(int n, vector<int> vec)
{
int l = 0, r = vec.size() - 1;
while(l < r)
{
int mid = l + r + 1>>1;
if(vec[mid] > n) r = mid;
else l = mid + 1;
}
return l;
}
此处注意int mid = l + r + 1 >> 1,,因为如果int mid = l + r >> 1,可能会导致死循环,导致l的值一直不变,记住一点,l = mid时, int mid = l + r + 1>> 1;
本文来源为acwing网站,yxc大佬之笔。