题目:连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为**O(n)**。
示例1:
1 | 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] |
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
分析:
我们用 f(i)
代表以第i
个数结尾的「连续子数组的最大和」
只需要求出每个位置的 f(i)
,然后返回 f
数组中的最大值即可。那么我们如何求f(i)
呢?
我们可以考虑 nums[i]
单独成为一段还是加入f(i-1)
对应的那一段,这取决于nums[i]
和f(i−1) + nums[i]
的大小,我们希望获得一个比较大的
于是可以写出这样的动态规划转移方程:f(i) = max{ f(i−1) + nums[i], nums[i] }
题解:
1 | class Solution { |
时间复杂度O(n),空间复杂度O(n)
改进:
由于 f[i]
只是与 f[i - 1]
和 nums[i]
有关,且 ret
只与当前的 f[i]
有关,不需要存储整个数组
1 | class Solution { |
时间复杂度O(n),空间复杂度O(1)
细节:
1.只需求出最大值,不用求出最大的子数组