您的位置:首页 > 其它

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

2015-08-19 22:33 253 查看
转载:http://blog.csdn.net/wcyoot/article/details/6436304

从一个取值范围为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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: