53. Maximum Subarray

Easy
自己做出来的方法是O(N2),TLE了.
看了答案, 发现其实也是按照sum[i, j] = sum[0, j] - sum[0, i]这公式,去找sum[0, j] - sum[0, i]的最大值。我的一种错误思路是找sum[0, j]的最大值和sum[0, i]的最小值,然而有可能这样找出来可能j < i不符题意,或者是遍历两边去找最大差导致TLE.
答案说明你要找sum[i, j] 的最大值,完全可以动态去直接找,不用想当然地去找被减数的最大值和减数的最小值. 因为preSum完全可以一直记录,再记录一个minPreSum就行了,那么preSum - minPresum就等于maxSubSum了.

public class Solution {
    public int maxSubArray(int[] nums) {
        int maxSubSum = Integer.MIN_VALUE;
        int preSum = 0;
        int minPreSum = 0;
        //sum[i,j] = sum[0,j] - sum[0, i];
        for (int i = 0; i < nums.length; i++){
            preSum += nums[i];
            maxSubSum = Math.max(maxSubSum, preSum - minPreSum);
            minPreSum = Math.min(minPreSum, preSum);
        }
        return maxSubSum;
    }
}

你可能感兴趣的:(53. Maximum Subarray)