请教一个简单问题

永远的明日 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 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
友情帮顶
楼下会有大牛贴出代码

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧