题目:一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。复杂度最好是O(n),如果是O(n2)则不得分。
算法:建立一个map<数列元素值, 对应索引>. 对每个元素i,如果N+1-i不在map中,插入i,否则输出(i, map[i]).复杂度O(n).
- #include <map>
- // ar为不重复的数列,输出ar中所有两数和为N的数对
- void PrintPairs(const std::vector<int>& ar, int N)
- {
- std::map<int, int> nodemap;
- for(size_t i = 0; i < ar.size(); ++i)
- {
- std::map<int, int>::const_iterator iter = nodemap.find(N - ar[i]);
- if(iter == nodemap.end())
- nodemap[i] = ar[i];
- else
- {
- printf("找到数对(%d, %d)/n", ar[iter->second], ar[i]);
- }
- }
- }
PS:可参考:http://blog.csdn.net/wcyoot/archive/2011/05/21/6435904.aspx