例如。 -3,6,11,13,5,-11,4,7,8最大和= 30(6,11,13因为加-3会使和更小)

例如。 7,0,-3最大和= 7

例如4,-1,45最大和= 45

例如-3-,-2,-6,0最大和= = 0

需要一些建议给我的代码,仍然有错误

    int maxSum = Integer.MIN_VALUE;
    int sum = 0;
    int checkNeg = Integer.MIN_VALUE;

    for (int i = 0; i < a.length; i++) {
        if (a[i] > checkNeg) {
            checkNeg = a[i];
        }
    }

    if (checkNeg <= 0) {
        maxSum = checkNeg;
    }

    if (checkNeg > 0) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] != 0) {
                sum += a[i];
                if (sum > maxSum) {
                    if (i != 0) {
                        if (a[i] >= a[i - 1]) {
                            maxSum = sum;
                        } else {
                            sum = a[i];
                        }
                    } else {
                        maxSum = sum;
                    }
                }
                if (sum < 0) {
                    sum = 0;
                }
            } else {
                sum = 0;
            }
        }
    }
    return maxSum;

最佳答案

尝试这个

        int maxSum = Int32.MinValue;
        int sum = 0;

            for (int i = 0; i < a.Length; i++)
            {
                if (a[i] >= 0)
                {
                    sum += a[i];
                    maxSum = Math.Max(sum, maxSum);

                    if ((i+1<a.Length) && (a[i+1] < a[i]))
                        sum = 0;
                }
                else
                {
                    maxSum = Math.Max(a[i], maxSum);
                    sum = 0;
                }
            }

        return maxSum;


似乎适用于您的所有示例以及其他几个示例。

不需要'checkNeg',该检查应该更自然地从算法中得出

关于java - 非递减序列的最大和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9010284/

10-11 20:32