社区
C++ 语言
帖子详情
请教一个简单问题
永远的明日
2010-01-28 12:46:53
输入一组数和一个整数k,从该组数中选取两个数x,y,使x+y = k,问这样的组合有多少?(输入规模在100000左右)
例:
1 2 3 4 5 //5个数
4 //k值
1 + 3 = 4
2 + 2 = 4
3 + 1 = 4
所以,输出3
我是先对数组排序,再用2分查找法k - val
提交后运行时间500多ms,有的大大几十毫秒就搞定了,所以请教各位老大怎样才能快点?^_^
...全文
231
20
打赏
收藏
请教一个简单问题
输入一组数和一个整数k,从该组数中选取两个数x,y,使x+y = k,问这样的组合有多少?(输入规模在100000左右) 例: 1 2 3 4 5 //5个数 4 //k值 1 + 3 = 4 2 + 2 = 4 3 + 1 = 4 所以,输出3 我是先对数组排序,再用2分查找法k - val 提交后运行时间500多ms,有的大大几十毫秒就搞定了,所以请教各位老大怎样才能快点?^_^
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
WPooh
2010-01-30
打赏
举报
回复
学习。
SML070107
2010-01-30
打赏
举报
回复
好像排序是多余,不排序不也是那么找吗?
tycoonliu
2010-01-30
打赏
举报
回复
有待研究,我自己觉得排序时很繁琐的事情
永远的明日
2010-01-30
打赏
举报
回复
[Quote=引用 18 楼 qulcc 的回复:]
是不是可以用多个 int or long表示呀?
不一定非要用一个数据32we位吧
[/Quote]
那该怎么做?
qulcc
2010-01-30
打赏
举报
回复
是不是可以用多个 int or long表示呀?
不一定非要用一个数据32we位吧
BirdLovesFish
2010-01-30
打赏
举报
回复
头像我很喜欢,是月影传说的吧
MagiSu
2010-01-30
打赏
举报
回复
哥们,看编程珠玑第一章吧。排序是多余的。查找可以用O(1)的时间复杂度查找。
永远的明日
2010-01-30
打赏
举报
回复
[Quote=引用 13 楼 magisu 的回复:]
哥们,看编程珠玑第一章吧。排序是多余的。查找可以用O(1)的时间复杂度查找。
[/Quote]
是用bitmap做吗?但输入的整数最大为2^31
holder273
2010-01-29
打赏
举报
回复
学习~~~
qulcc
2010-01-29
打赏
举报
回复
感觉bitmap或许还不错!
ls2141
2010-01-29
打赏
举报
回复
。。
ithiker
2010-01-28
打赏
举报
回复
lz的想法很好
由于通常的比较排序的时间复杂度为nlog(n),这些都和初始的数值顺序有关,不稳定:有时O(n),
有时o(n^2),另外,二分查找为log(n)。故整个算法时间复杂度:nlog(n)
结果有的快有的慢主要是因为排序算法的不稳定吧,建议选用非比较的排序算法:例如计数排序、基数排序、桶排序等等线性时间运行的算法。这些算法快且稳定。
mstlq
2010-01-28
打赏
举报
回复
bitmap或者hash
xylicon
2010-01-28
打赏
举报
回复
可以考虑空间换时间,用一个hash map, key就是这组数里的数。然后遍历hash map
k - key = key2; 在hash map 中 lookup key2,如果lookup 有结果就num++;
这样遍历完一次hash map 也得到了结果num。
永远的明日
2010-01-28
打赏
举报
回复
up一下
cbajing
2010-01-28
打赏
举报
回复
你不累吗?
[Quote=引用 4 楼 berryluo 的回复:]
假设有n个数,为A[1]A[2]。。。A[n]
对A排序得到数组B[1]B[2]。。。B[n];
对B做一次排序统计,把相同的数合并得到一个二维的C数组C[n][2],其中C[i][0] C[i][1]分别表示B数组中值为C[i][0]的数有C[i][1]个,假设统计之后C数组共有m个数;
另设一个数组D[m][2];其中D[i][0] = k - C[m - i - 1][0];D[i][1] = C[m-i-1][1];则D数组也是一个有数组,设置两个指针i,j,对C,D数组做一次扫描,就可以统计出答案了,如果C[i][0] == D[j][0];则ans += C[i][1] * D[i][1];最后得到ans就是答案!
[/Quote]
berryluo
2010-01-28
打赏
举报
回复
假设有n个数,为A[1]A[2]。。。A[n]
对A排序得到数组B[1]B[2]。。。B[n];
对B做一次排序统计,把相同的数合并得到一个二维的C数组C[n][2],其中C[i][0] C[i][1]分别表示B数组中值为C[i][0]的数有C[i][1]个,假设统计之后C数组共有m个数;
另设一个数组D[m][2];其中D[i][0] = k - C[m - i - 1][0];D[i][1] = C[m-i-1][1];则D数组也是一个有数组,设置两个指针i,j,对C,D数组做一次扫描,就可以统计出答案了,如果C[i][0] == D[j][0];则ans += C[i][1] * D[i][1];最后得到ans就是答案!
lshangbo
2010-01-28
打赏
举报
回复
1, 先找出比后面输入的那个数k小的数放进队列,
2, 然后对队列排序,
3, 然后再对队列中的前半队列中每一个数val求k-val, 在后半队列中找这个k-val,找到计数num++;
z569362161
2010-01-28
打赏
举报
回复
查手指头算法。
最快
lovesi3344
2010-01-28
打赏
举报
回复
友情帮顶
楼下会有大牛贴出代码
向别人
请教
问题
,不要这样开头
能问你
一个
问题
吗? 有谁知道xxx吗? 当然你向我提问的时候,也不用称呼为大佬或者大神之类的,我就是
一个
普通的开发者。 为什么 毋庸置疑,你提问的目的自然是想得到解答,而上面三种提问方式都有
一个
...
英文邮件礼仪:向教授
请教
学术
问题
英文邮件礼仪:向教授
请教
学术
问题
邮件主题 邮件主题(subject)不需要写自己的名字...
一个
好的标题,要能简洁地概括邮件的目的或内容。如果你对教授的某个研究项目感兴趣,就可以用这个研究方向作标题,例如"De
聊聊
请教
技术
问题
的正确方式
但当发消息
请教
时却如石沉大海,毫无回音。难道技术大牛都那么高冷么? 当你备注了添加好友的原因,如果对方通过了,其实已经表明愿意就此内容与你沟通交流。但为什么当你发消息时却得不到回应?这不排除对方很忙,...
学会和人沟通与
请教
问题
秘籍
2.1.2 学会沟通与
请教
问题
在当今的社会,无论在任何
一个
行业,以及做任何事情,首先需要学会的就是有效地沟通与交流表达,如果你是动物世界迷,你会发现动物界也是一样的。当然Linux运维人员也不例外了。 朋友们...
遇到大牛如何获得联系方式及
请教
问题
遇到一位大神,你说:非常崇拜您,想
请教
一些
问题
,能否加个微信?这种要联系方式的结果往往是被拒绝。而更好的方式是:我所在的公司些业务可能会与您合作,想跟你分享交流一下,不知是否可以留个联系方式。 虽然...
C++ 语言
64,644
社区成员
250,475
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章