求最大子序列和

来源:互联网 发布:锐速 原理 知乎 编辑:程序博客网 时间:2024/05/17 15:18

[问题描述]给定一整数序列A1, A2, A3, … , An(可能会有负数),求A1 ~ An的一个子序列Ai ~ Aj,使得Ai 到Aj的和最大。

[Input] 1, 2, -23, 6,3,1,-5,7,-11.

[Ouput] 12

因为:6+3+1+(-5)+7 = 12。

这道题有很多解法。最简单的就是暴力穷举。用3个for循环来遍历所有的子序列的求得和,平均复杂度为O(n^3)。我这里用了一个很好的算法来解决,平均复杂度只有O(n),利用了动态规划实现。代码如下:

package MaxSubSum;public class MaxSubSum {    //求最子序列和,平均复杂度为O(n)    public static int getMaxSubSum(int a[]){        int max = 0, sum = 0;        for(int i=0; i < a.length; i++){            sum += a[i];            if(max < sum)                max = sum;            else if(sum < 0)  //关键点,因为sum某一个字符字串的最大和,当sum如果小于0,则要重新i计算sum了。                sum = 0;        }        return max;    }    public static void main(String args[]){        int a[] = {1, 2, -23, 6,3,1,-5,7,-11};         System.out.println( getMaxSubSum(a));    }}

参考书籍《数据结构–java语言描述》刘小晶版。

1 0