社区
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,有的大大几十毫秒就搞定了,所以请教各位老大怎样才能快点?^_^
...全文
306
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
打赏
举报
回复
友情帮顶
楼下会有大牛贴出代码
一个
简单
的背包
问题
有不同重量的物品,只要找到一种方案恰好装满背包即可#define N 7#define S 15int w[N+1]={0,1,4,3,4,5,2,-100};int knap(int s,int n);int main(int argc, char* argv[]){ if (knap(S,N)) printf("/nOK!/n"); else pri
一个
简单
又不
简单
的
问题
——什么是富有实践经验的技术人员
【
一个
简单
的
问题
】 这是某网站注册的
一个
问题
。 这是一段很
简单
的java代码。不涉及高深的技术和算法,coder们觉得一眼就出答案的小题目。这道题的限定答题时间是60s,你可以试一下,60s内能答对否。 先不谈这题的答案,当然最后我肯定会公布的。不知道大家是否注意到了上图中那行灰色的字:注册账号需先正确解答试题,仅开放给富有实践经验的技术人员。那么——什么是富有实践经验
工作遇到
一个
简单
问题
的思考
工作遇到
一个
简单
问题
的思考 最近工作中遇到
一个
问题
,前前后后共定位了4天+,当最后定位到根因的时候,才发现“最后出
问题
的地方往往是那些你认为最不会出
问题
的地方”这句话是警示名言,要牢记之。
问题
场景:有一大片内存,从起始地址开始以128KB大小切块(低地址的64KB内存设置为只读,高地址的64KB内存主要用于任务栈),大概有205000个;现在写个函数从低地址开始把每个栈的低地址写入数组。 代码大概
一个
简单
的
问题
一个
简单
问题
,window下的
一个
服务流水线在正常执行的情况下磁盘满了。我们使用这个及其作为执行机,每次都进行一套
简单
服务的执行。平均每个服务传来的包的大小都是200M左右,但是它们是成套服务,总共有20多条流水线都在同
一个
时间段在使用这个执行机在跑服务。 我们发现他们范了
一个
严重的错误,系统盘总共它们申请了65G而虚拟内存就已经占用了25G,标准Win7环境下,系统本身空间一般都在使用一段时间...
一个
很
简单
的数学
问题
我老婆去市场买菜,她8块钱买了一只鸡。 回来的路上,她同事想买她的鸡。于是我老婆9块钱把鸡卖给了同事。 后来她想中午我想吃鸡,又找到同事,10块钱买了回来。 到了家门口,邻居来了客人,少了菜,一定要我老婆把鸡卖给他,我老婆又11块钱卖给了邻居。 问:我老婆赚了多少钱? ----------------------------------- 第一步就是收集信息,“老婆,市场,鸡,路上,...
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章