问大家一个问题

blingpro 2008-06-04 09:30:37
对一个数组,数组里面包含正负数,乱序的,在里面选择三个数(A,B,C),使得满足:A+B=C,如何求得C的最大值!时间复杂度多少!
...全文
95 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
哦,是的。后面判断是否能分解可以在O(n)内完成。
tailzhou 2008-06-04
  • 打赏
  • 举报
回复
复杂度可以到o(n^2);

不妨假设C=A+B中A>B;

1)首先排序,假设排序后的数组为DATA[1..n];
2)从大到小判断DATA[i]是否是可能的A;
即判断DATA[i]+DATA[j] 1<j<i 是否在DATA数组中,这是可以o(n)解决的;
注意到 DATA[i]+DATA[j]总比DATA[i]+DATA[j-1]大;
所以对j从i-1到1降序判断;只需要遍历数组一遍;

  • 打赏
  • 举报
回复
假设数组中所有元素的绝对值<=M,开辟一个b[-M~M]大小的数组,初始化所有元素为0
然后遍历原数组a,遍历过程中令 b[a[i]]++
最后从尾到头扫描b数组,对于b[t]>0,检查是否存在i+j=t存在且b[i]>0、b[j]>0(如果i=j,则需要b[i]>=2)
  • 打赏
  • 举报
回复
排序是O(n*logn)

从大到小检查元素C是否可以分解成C=A+B:
二分查找B=C-A是否存在需要O(logn),对于每个A进行一下这样的二分查找就成了O(n*logn)
针对每个元素C都要执行这样的分解试探,所以整体复杂度是O(n^2*logn)

blingpro 2008-06-04
  • 打赏
  • 举报
回复
如何hash?
以前没用过,请指点
blingpro 2008-06-04
  • 打赏
  • 举报
回复
问一下:
ls的复杂度是 O(logn + n^2)??
排序O(logn)
对每个C搜索A,B,n^2
是这样吗?
  • 打赏
  • 举报
回复
如果数组中所有元素的绝对值范围不大(<=M),hash一下空间换时间,可以到O(M^2)
  • 打赏
  • 举报
回复
ls说的有问题:
求出任意两对的和 ——O(n^2)
判断和是否在数组里——O(n)
所以整体的复杂度应该是O(n^3)

如果先将这个数组排好序,然后从大到小检查元素C是否可以分解成C=A+B,O(logn*n^2)会好一些

cz_hyf 2008-06-04
  • 打赏
  • 举报
回复
求出任意两对的和,并判断和是否在数组里,如果是的话用S记下来,求出S的最大值 复杂度为O(n^2)
blingpro 2008-06-04
  • 打赏
  • 举报
回复
学到东西了,thanks

33,008

社区成员

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

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