一个小算法问题

BaiYunfeng 2004-06-07 11:19:59
有N个数,数字大小范围在-2^32—2^32之内,从他们之中连续取出M个数并相加(L1<=M<=L2),(1<=L1<=L2<=N),请问可以得到的数字的最大的和是多少?
请问这个题的O(N)算法是什么啊?
...全文
224 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
javacomte 2004-06-14
  • 打赏
  • 举报
回复
将所有正数相加不就可以了
WYlslrt 2004-06-12
  • 打赏
  • 举报
回复
直接扫描一遍绝对能出来结果.
BaiYunfeng 2004-06-09
  • 打赏
  • 举报
回复
怎么肯定是N呢?那我们假设L2-L1也不是常数,能否给出一个比O(log(L2-L1)*N)更优的算法,谢谢。
BinaryTreeEx 2004-06-09
  • 打赏
  • 举报
回复
复杂度肯定是N
dengsf 2004-06-09
  • 打赏
  • 举报
回复
我觉得 L2-L1 相关的因子不能去掉,顶多只是优化。对于 N 不大的情况,应该问题不算太大的~
但有趣的是,当 L1=1, L2=N 的时候,前面的 L2-L1 反而可以去掉……
楼主如果找到好方法,请分享一下。
junnyfeng 2004-06-08
  • 打赏
  • 举报
回复


M虽然是有范围,但每次进行程序时必定是给定的,或程序中给定或手工输入

然后再进行一楼给的算法就可以
BaiYunfeng 2004-06-08
  • 打赏
  • 举报
回复
M只能在L1到L2的范围内取,请看清题,你那个算法只适用于对M没有限制的时候。
BaiYunfeng 2004-06-08
  • 打赏
  • 举报
回复
M是没有定的,谢谢。
canjian 2004-06-08
  • 打赏
  • 举报
回复
同意楼上!
BaiYunfeng 2004-06-08
  • 打赏
  • 举报
回复
但是这样做的话,L2-L1=N-1时,算法好慢啊。我知道一个用堆优化的O(log(L2-L1)*N)的算法。但是能不能把(L2-L1)去掉,或者说换成一个(简单描述),N=10^8, L2-L1=5*10^7时,可以瞬间出解的算法啊?谢谢。
dengsf 2004-06-08
  • 打赏
  • 举报
回复
题目的意思是 M 是在一定范围内变化,而不是固定的。

我有个大概思路,但没有优化, 仅供参考:
// 数组下标以 1 开始

1 设输入数组为a[n],计算出S(n)(from 1 to n),其中S(n)为前n项的和 ---- O(n)
2 初始化一些变量:
curMax = s[1]; //记录目前所找到的最大值 ----- O(1)

/*
求最大值,其实等价于求 si - sj 的最大值,其中 j>=1, j+L1<= i <= j+L2
*/
3 for( int i=2 to n ){
从 S[i-L2, i-L1] 中选出最小的值 min; -----O( L2-L1 )
S[i] - min > curMax ? curMax = S[i]-min : do-nothing;
}
--- O( (L2-L1)*n )

所以总的复杂度为 O( (L2-L1)*n ).
但对于给定的 L2,L1, L2-L1 为常数,故复杂度为 O(n).

----------
这方法是从 M 没有限制的情况下扩展出来的~
这只是最基本的思路,还可以进行大幅度的优化,比如1 跟 2,3 同时进行。 求最小值也可以通过一些方法来简化。但对于 L2,L1 固定的情况来说,这些方法只能减少常数因子。
BaiYunfeng 2004-06-08
  • 打赏
  • 举报
回复
运行时当然是给出L1和L2,不会给定M
LeeMaRS 2004-06-08
  • 打赏
  • 举报
回复
...那不就是扫描一遍咯...

先求出从1开始的连续M个数之和sum, 与当前最优解比较, 取较优值.
然后往后移一位, 即将sum加上第M+1个数, 减去第1个数, 得到从2开始的连续M个数之和sum, 与当前最优解比较, 取较优值...

这样扫描一遍, 复杂度是O(N)的.

33,008

社区成员

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

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