N个数中找三个数,使其和的绝对值最小

huochai2008 2010-07-11 06:26:54
难道只能枚举了?
...全文
229 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsukuro 2010-07-14
2010Baidu百度知道开放平台
回复
fanster28_ 2010-07-12
O(n^2)可以解决,排序,设所选三个数为a<=b<=c
枚举b,
两端逼近,
i=1 j=n
while (i<j)
if s[i]>b or s[j]<b
break
if s[i]+s[j]>-b
j--
else
i++

注意中间记录最优解值就行了
回复
wxc1987821 2010-07-12
mark
回复
超级大笨狼 2010-07-12
O(n)时间内把数字分为A正,B负,和C0,长度分别是a,b,c

因为abc每个都有0或者大于0两种情况,所以2×2×2可能有8种情况

如果abc三者都大于0
O(a*b)时间内得到min(A+B)就是结果

如果只有正数或负数
挑选最小的三个O(n)内就可以。

总之,需要把8种Case考虑一遍。

复杂度不会超过O(a*b)
回复
showjim 2010-07-12
将N个数分为正V、负S两个集合并分别排序,然后相互扫描,复杂度为V*log(V)+S*log(S)+2*V*S
回复
fy1517 2010-07-12
大家都很强大 学习了
回复
oyzdz1988 2010-07-12
没想到很好的解法,在网上找了下,感觉这个解决的不错~

http://hi.baidu.com/busycai/blog/item/53f2fb3810420ac8d562259d.html
回复
softwarekid 2010-07-12
对不起楼主,ms只提高了一点点,不对的地方,还请指教。

枚举的复杂度是:C k 3 = O(k^3)


将k个数(假设有n个正数,m个负数)分为正数和负数,然后分别对正数和负数排序,快速排序为O(k^2)
-1 2 3 -5 6 0
排序完成后:
0 2 4 6
-5 -1

要想绝对值最小,三个数里面必有正数和负数。

当为一个负数时:
例如-5,-5与0相加,结果为正数则找剩余正数中的最小值;为负数则找与所得结果绝对值最相近的正数,折半查找 O(log n),有m个负数则就有:m*log(n)*n


当为两个负数,即为一个正数时,方法和为一个负数的情况相同。

最后再比较两个情况的最小值。

总的复杂度为O(m*log(n)*n)。


回复
pmars 2010-07-12
留名……
回复
michael122 2010-07-12
ls正解
跟寻找和为固定值的2个数的算法一样
回复
花爺 2010-07-11
[Quote=引用楼主 huochai2008 的回复:]
难道只能枚举了?
[/Quote]
同意!
回复
acdbxzyw 2010-07-11
ms是的吧。
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告