LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 797|回复: 3

征求更好的答案

[复制链接]
发表于 2006-3-14 14:21:44 | 显示全部楼层 |阅读模式
题目:
给定K个整数序列{N1, N2,...NK}, 其任意连续子序列 {Ni, Ni+1,.... Nj}(i <=i<=j<=k);最大连续子序列是所有连续子序列里边所有元素和最大的那个, 如序列{-2, 11, -4, 13,-5, -2}, 最大连续子序列为{11, -4, 13}, 最大和20,

要求:
给定一个序列,求出其最大和, 并且输出该最大子序列第一个和最后一个元素, 如最大子序列不唯一, 则输出, i和j最小的那个,如k个元素都是负数, 则最大和为0, 输出整个序列首尾元素。

要求给出算法的时间复杂度为O(N), 空间复杂度要最小。


各位有什么好的算法能达到时间/空间复杂度要求的?
发表于 2006-3-14 15:05:29 | 显示全部楼层
换个符号吧:

设给定的n个数为a_1,a_2,...,a_n.
定义S_k=a_1+a_2+...+a_k.
从前向后计算S_k,
并且记录S_1,...,S_k中的最小者,
计算S_k与此最小值的差, 记录这个差的最大者,以及对应的两个脚标.

这个算法就应满足要求.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-14 15:19:19 | 显示全部楼层
[QUOTE

从前向后计算S_k,
QUOTE]

这里的复杂度就是O(N^2)了, 没有满足要求
回复 支持 反对

使用道具 举报

发表于 2006-3-14 15:39:12 | 显示全部楼层
to alexlee002:
是累加计算啊, 每次在前面的结果加上新的值就行, 不用保存S_k的值.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表