53.Maximum Subarray

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        res = float('-inf')
        tmp = 0
        for i in range(n):
            if tmp < 0:
                tmp = 0
            tmp = tmp + nums[i]
            res = max(tmp, res)
        return res
        

Java 版:

  • 动态规划,时间复制度 O(n);
  • 因为正数 preSum 与 X 相加,才会大于 X,相当于正反馈,则累加 X,继续滚雪球;
  • 否则,负数与 X 相加,负反馈,相加后比 X 本身的值还要小,则重新开始累加;

class Solution {
    public int maxSubArray(int[] nums) {
        int preSum = nums[0], res = preSum; // preSum为前面最大子序列的和
        for(int i = 1; i < nums.length; i++){
            if(preSum < 0) preSum = nums[i]; //前面最大的和小于 0,则重新开始累加
            else preSum += nums[i]; //否则,继续保持累加
            res = preSum > res ? preSum : res; //每一次都要比较最大的结果
        }
        return res;
    }
}
原文地址:https://www.cnblogs.com/luo-c/p/12857203.html