题目链接
英文链接:https://leetcode.com/problems/maximum-subarray/
中文链接:https://leetcode-cn.com/problems/maximum-subarray/
题目详述
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
1 | 输入: [-2,1,-3,4,-1,2,1,-5,4], |
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
题目详解
动态规划经典题目。运用两个变量 maxSum、curSum,遍历一次即可。
- 首先初始化 maxSum、curSum 为数组中的第一个元素,maxSum 用来记录最终结果,curSum 用来记录当前的和。
- 只有
curSum > 0
时,nums[i] 加上 curSum 才会得到一个更大的和。 - 当
curSum < 0
时,nums[i] 加上 curSum 反而会使加和变小,故直接令curSum = nums[i]
。 - 每次比较 maxSum 和 curSum,当
curSum > maxSum
时,更新 maxSum。
1 | public class LeetCode_00053 { |
分治法也可以解决本题,时间复杂度为 O(nlogn),上面 DP 的时间复杂度为 O(n)。
1 | public class LeetCode_00053 { |