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; } }