Less than 1 minute

class Solution {
    public int maxSubArray(int[] nums) {
        int pre = 0;
        int maxPre = nums[0];
        for (int i = 0; i < nums.length; i++) {
            pre = Math.max(pre + nums[i], nums[i]);
            if (pre > maxPre)
                maxPre = pre;
        }
        return maxPre;
    }
}

前缀和解法

由于子数组的元素和等于两个前缀和的差,所以将数组转化为前缀和数组,问题就变成 121. 买卖股票的最佳时机 了。

[−2,1,−3,4,−1,2,1,−5,4] 👉 [0, −2, -1,−4, 0, −1, 1, 2, −3, 1]

本题子数组不能为空,相当于一定要交易一次。

class Solution {
    public int maxSubArray(int[] nums) {
        int profit = Integer.MIN_VALUE;     // 最小值,则for中必买一次
        int minPreSum = 0;      // 最低价格。即前缀和中的第一个元素 0
        int preSum = 0;     
        for (int x : nums) {
            preSum += x; // 当前的前缀和,相当于股票今日价格
            profit = Math.max(profit, preSum - minPreSum); // 减去前缀和的最小值
            minPreSum = Math.min(minPreSum, preSum); // 维护前缀和的最小值
        }
        return profit;
    }
}