在排序数组中查找给定数字的最后一次和首次出现的位置。如果数字不存在,则将上下边界打印为-1。
我编写了如下代码,但是我无法通过所有测试用例。谁能告诉我为什么?
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
int n,num,q,find;
cin>>n;
v.reserve(n);
for(int i=0;i<n;i++){
cin>>num;
v.push_back(num);
}
sort(v.begin(),v.end());
cin>>q;
while(q--){
cin>>find;
auto lb=lower_bound(v.begin(),v.end(),find);
auto ub=upper_bound(v.begin(),v.end(),find);
if(lb==v.end() || v.empty()){
cout<<-1<<" "<<-1<<endl;
}
else{
cout<<lb-v.begin()<<" "<<ub-v.begin()-1<<endl;
}
}
return 0;
}
最佳答案
顾名思义,std::lower_bound(first, last, value)
找不到等于value
的元素,而是找到lower bound(不小于value
的第一个元素)。例如,对于范围1 3 5
和目标值2
,它将返回指向3
的迭代器。
要检查元素是否存在于数组中,可以编写
auto pos = std::lower_bound(first, last, value);
if (pos != last && *pos == value)
// ...
还应注意,对
std::lower_bound
和std::upper_bound
的两个调用可以替换为对 std::equal_range
的单个调用。关于c++ - 涉及上限和下限的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61439663/