从一个取值范围为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]);
}
}
}
从一个取值范围为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]);
}
}
}
相关文章推荐
- 我在写多语言支持时用到的东西
- 设计模式实例(Lua)笔记之二(AbstractFactory抽象工厂模式)
- 深度卷积网络CNN与图像语义分割
- smb-cifs-nfs-samba认识
- hdu4252单调栈
- iOS开发页面之间的几种传值方式
- 8-19
- java(08-19)
- [知识点]后缀数组
- win7下IIS安装与配置运行网站
- 曾经的你
- easyui------显示隐藏列功能
- Java Web工程配置log4j相对路径
- Android学习0819<三>(Activity的操作)
- C# 事件驱动基础
- R语言_基本图形
- 第一天
- Android Api Demos登顶之路(三十九)Fragment-->show hide
- async-http-client开源库学习笔记(一)
- 网页制作之html基础学习6-CSS浏览器兼容问题