剑指 Offer 42. 连续子数组的最大和
动态规划解决子列和问题
题目链接-来源:力扣(LeetCode)
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
思路:
我们希望在O(n)的复杂度内完成最大值的计算,那么就需要在每一次考察新元素的时候充分利用已有元素信息,自然想到动态规划。
记dp[i]表示「截至第i个元素,数组中出现的子数组和的最大值」,这样我们每次同步更新一个 dp[i] 的最大值,直到数组末尾,代表的意义就是题目所要求的结果。
递推规则:考察dp[i - 1]是否大于0。若 dp[i - 1] <= 0,证明前驱的子数组对我们增大子数组和没有帮助,我们就舍弃之,只留下 nums[i] 的值供后续子数组参考;否则,我们留下 dp[i - 1] 的值,加上 nums[i] 的值,构成当前位置的 dp[i]。
每次更新 dp,维护一个最大值,最后返回即可。
时间复杂度:O(n)
空间复杂度:O(n)
实现:
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.