题解 | #查找#
查找
https://www.nowcoder.com/practice/8e0c0e8c78944847be9bca54b59d713f
#include<bits/stdc++.h>
#include <vector>
#include <set>
#include <iostream>
using namespace std;
int main(){
set<int>s;
//write your code here......
int n, m;
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
int num;
cin >> num;
s.insert(num);
}
int i = 0;
while (i < m)
{
int k;
cin >> k;
auto it = s.upper_bound(k);
if (it != s.end())
cout << *it;
else
cout << -1;
cout << endl;
++i;
}
return 0;
}
原来定义了一个匿名函数,用的find_if来实现的,没想到超时了,使用upper_bound就可以了.
其他牛友的题解也很巧妙:
int flag=0;
set<int>::iterator it;
while(m--){
cin>>temp;
it=s.find(temp);
if(it==s.end()){
s.insert(temp);
it=s.find(temp);
flag=1;
}
it++;
if(it==s.end())cout<<-1<<endl;
else cout<<*it<<endl;
if(flag){
flag=0;
it--;
s.erase(it);
}
}
如果所寻找的元素不在原来的set里,就插入进来,然后判断这个元素插入的位置,通过it++看是不是插到了末尾,如果是说明原来的set没有元素大于它,输出-1,否则就就输出当前it对应的元素。最后要记得用erase把元素删除
C++题解 文章被收录于专栏
记录在牛客网用C++刷题的题解思路



查看7道真题和解析