- 论坛徽章:
- 0
|
第二题的通用算法- /**
- * 一个数组中有N个数字出现的次数都超过数组总长度L的1/(N+1),查找这些ID
- * */
- #include <iostream>
- #include <cstring>
- #include <map>
- #include <algorithm>
- #include <utility>
- using namespace std;
- //数组:arr
- //长度:size
- //数字个数:n
- map<int,int> find(int* arr,int size,size_t n)
- {
- map<int,int> candidate;
- for(int i=0;i<size;++i)
- {
- if(candidate.find(arr[i])!=candidate.end())
- {
- ++candidate[arr[i]];
- }
- else if(candidate.size()==n)
- {
- for(auto index=candidate.begin();index!=candidate.end();)
- {
- --(index->second);
- if(index->second==0)
- candidate.erase(index++); //注意这里的写法,否则,index已经失效,将没办法遍历
- else
- ++index; //注意区别
- }
- }
- else
- {
- candidate.insert(make_pair(arr[i],1));
- }
- }
- return candidate;
- }
- int main(int argc,char* argv[])
- {
- int arr[]={1,2,3,5,1,2,3};
- map<int,int> candidate=move(find(arr,sizeof(arr)/sizeof(int),3));
- for_each(candidate.begin(),candidate.end(),
- [](const pair<int,int>& val)
- {
- cout<<"Val: "<<val.first<<endl;
- }
- );
- return 0;
- }
复制代码 |
|