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

huochai2008 2010-07-11 06:26:54
难道只能枚举了?
...全文
443 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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是的吧。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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