题解 | #查找#
查找
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++刷题的题解思路