社区
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,有的大大几十毫秒就搞定了,所以请教各位老大怎样才能快点?^_^
...全文
247
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
作业
写回复
配置赞助广告
用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
聊聊
请教
技术
问题
的正确方式
在日常生活中会经常遇到不懂的技术
问题
,好不容易找到这方面的行家,申请添加微信或QQ对方也通过了。但当发消息
请教
时却如石沉大海,毫无回音。难道技术大牛都那么高冷么? 当你备注了添加好友的原因,如果对方通过了,其实已经表明愿意就此内容与你沟通交流。但为什么当你发消息时却得不到回应?这不排除对方很忙,忙得忘记回答你的
问题
。更大的可能是你的提问或沟通方式不对。 最近作为被问者,被此
问题
困扰了好久,甚至在某...
学会和人沟通与
请教
问题
秘籍
2.1.2 学会沟通与
请教
问题
在当今的社会,无论在任何
一个
行业,以及做任何事情,首先需要学会的就是有效地沟通与交流表达,如果你是动物世界迷,你会发现动物界也是一样的。当然Linux运维人员也不例外了。 朋友们可能由于不善于乐于沟通而选择了运维职业,而选择了运维职业又导致更不善于乐于沟通了。老男孩周边的大多数运维朋友,都不善于沟通也不乐于沟通,更不知道如何沟通。 其实,在企业里...
程序员应该如何去
请教
别人
问题
程序员应该如何提问
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章