算法题29 从一个取值范围为1~N的不重复数列中找出所有满足两数和为N+1的数对

题目:一个整数数列,元素取值可能是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[ar[i]] = i; else { printf("找到数对(%d, %d)/n", ar[iter->second], ar[i]); } } } 

 

PS:可参考:http://blog.csdn.net/wcyoot/archive/2011/05/21/6435904.aspx

 

你可能感兴趣的:(算法,iterator,n2)