返回一个整数数组中最大子数组的和


要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)

import java.util.Scanner;

public class sum {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();//输入n在值,n为随机数组元素的个数
        int[] randoms = new int[n];//创建一个元素个数为n的数组
        int[] sum = new int[n];//该数组用来下面操作时生成的子数组内的元素和
                                //假设random数组的第一个值加到第i(i>=0)个值时期间均大于零
                                //那么sum数组的第i个值就是random的第一个值加到第i个值
                                //当random数组的第一个值加到第j(j>i,j>=1)个值时小于0
                                //那么sum的第(j+1)个值为random的第j个值
                                //当random的第(j+1)个值加到第k(k>=(j+1))个值时期间均大于零
                                //那么sum的第k个值为random数组的第j个值加到第k个值
                                //当random数组的第j+1个值加到第s(s>k)个值时小于0
                                //那么sum的第s+1个值为random数组的第(s+1)个值
                                //以此类推,得出sum数组
        for (int i = 0; i < n; i++) {//给randoms数组赋值
            randoms[i] = scan.nextInt();
        }
        sum[0] = randoms[0];//将数组内的第一个值作为第一个子数组
        int max = sum[0];//sum数组里最大的数
        for (int i = 1; i < n; i++) {
            /*
            * 这里要求sum数组之后的元素,求sum[i]时,当sum[i-1]>=0,说明random[i]加上sum[i-1]不会变小,
            * 那么就让sum[i] = sum[i - 1] + randoms[i]
            */
            if (sum[i - 1] >= 0) {
                sum[i] = sum[i - 1] + randoms[i];
            } else {
                sum[i]=randoms[i];
            }
            if(max<sum[i]){
                max=sum[i];
            }
        }
        System.out.println(max);//输出最大值
    }
}