#include <iostream>
#include <vector>
using namespace std;
//返回最后一个小于target的数 如果所有的数都比target大则返回第一个数
int func1(const vector<int> &vec,int target)
{
int left = 0, right = vec.size() - 1;
while (left < right)
{
int mid = (left + right + 1) / 2;
//每定位到一个大于等于target的数字,都取左边一块
if (target<=vec[mid]) right = mid - 1;
else left = mid;
}
return vec[left];
}
//返回最后一个小于等于target的数 如果所有的数都比target大则返回第一个数
int func2(const vector<int> &vec, int target)
{
int left = 0, right = vec.size() - 1;
while (left < right)
{
int mid = (left + right + 1) / 2;
//每定位到一个大于target的数字,都取左边一块
if (target<vec[mid]) right = mid - 1;
else left = mid;
}
return vec[left];
}
//返回第一个大于target的数字
int func3(const vector<int> &vec, int target)
{
int left = 0, right = vec.size() - 1;
while (left < right)
{
int mid = (left + right) / 2;
//每定位到一个小于等于target的数字,就取右边一块
if (target>=vec[mid]) left = mid + 1;
else right = mid;
}
return vec[left];
}
//返回第一个大于等于target的数字
int func4(const vector<int> &vec, int target)
{
int left = 0, right = vec.size() - 1;
while (left < right)
{
int mid = (left + right) / 2;
//每定位到一个小于target的数字,就取右边一块
if (target>vec[mid]) left = mid + 1;
else right = mid;
}
return vec[left];
}
int main()
{
vector<int> vec = { 1,2,3,3,3,5,7 };
int target = 3;
int ans = func1(vec, target);
cout << "最后一个小于"<<target<<"的数字" << ans<<endl;
ans = func2(vec, target);
cout << "最后一个小于等于" << target << "的数字" << ans << endl;
ans = func3(vec, target);
cout << "第一个大于" << target << "的数字" << ans << endl;
ans = func4(vec, target);
cout << "第一个大于等于" << target << "的数字" << ans << endl;
return 0;
}
二分法:数组中第一个大于(等于)目标的数,最后一个小于(等于)目标的数字
最新推荐文章于 2022-10-31 17:06:42 发布