要求:对于一个严格升序排列的数组,分别找出不小于特定值x的第一个数和不大于x的最后一个数
例:1 2 3 4 5 6 7 8 9 10
不小于x=5的第一个数为:5
不大于x=5的最后一个数也为:5
#include <iostream>
#include <vector>
using namespace std;
int GetLastValueLessThan(int v, vector<int>& svec)
{
int low = 0, high = svec.size() - 1;
while( low <= high )
{
int mid = (low + high) >> 1;
/* 如果要求查找严格小于x的第一个数,将改为svec[mid] >= v*/
if( svec[mid] > v )
high = mid - 1;
else low = mid + 1;
}
return svec[high];
}
int GetFirstValueGreaterThan(int v, vector<int>& svec)
{
int low = 0, high = svec.size() - 1;
while( low <= high )
{
int mid = (low + high) >> 1;
/* 如果要求查找严格大于x的最后一个数,将改为svec[mid] > v*/
if( svec[mid] >= v )
high = mid - 1;
else low = mid + 1;
}
return svec[low];
}
int main()
{
vector<int> svec;
for(int i = 0; i < 10; ++i)
svec.push_back( i + 1 );
for(int i = 0

在严格升序排列的数组中,通过二分查找法可以高效地找到不小于x的第一个数(5)和不大于x的最后一个数(同样为5)。这种算法适用于有序数据结构,能快速定位目标值的边界。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



