目录
一、问题描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
二、思路
仍然是动态规划四步法:
1.确定状态
1.1 研究最后一步
设目前最后一个元素为第n个元素,子数组为以第n-1个元素结尾的数组。
假设以第n-1个元素结尾的子数组和>0,说明其与第n个元素会产生正效益,
则以n结尾的最大连续子数组和为:以第n-1个元素结尾的子数组和 + 第n个元素后的结果
1.2 化为子问题
以第n个元素结尾的最大连续子数组和为多少
2.转移方程
设f[n]为以第n个元素结尾的最大连续子数组和.
则有:f[n] = f[n-1]>0?f[n-1] + nums[n-1]:nums[n-1];
3.初始条件和边界情况
3.1 初始条件
f[0] = 0;
f[1] = nums[0];
3.2 边界情况
无
4.计算顺序
以下标升序为顺序
三、代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//1.确定状态
//1.1 研究最后一步
//设目前最后一个元素为第n个元素,子数组为以第n-1个元素结尾的数组。
//假设以第n-1个元素结尾的子数组和>0,说明其与第n个元素会产生正效益,
//则以n结尾的最大连续子数组和为:以第n-1个元素结尾的子数组和 + 第n个元素后的结果
//1.2 化为子问题
//以第n个元素结尾的最大连续子数组和为多少
//2.转移方程
//设f[n]为以第n个元素结尾的最大连续子数组和.
//则有:f[n] = f[n-1]>0?f[n-1] + nums[n-1]:nums[n-1];
//3.初始条件和边界情况
//3.1 初始条件
//f[0] = 0;
//f[1] = nums[0];
//3.2 边界情况
//无
//4.计算顺序
//以下标升序为顺序
if(nums.empty())
{
return 0;
}
int n = nums.size();
vector<int> f(n+1,0);
f[1] = nums[0];
int max = f[1];
for(int i = 2;i<=n;i++)
{
f[i] = f[i-1]>0?f[i-1]+nums[i-1]:nums[i-1];
if(f[i]>max)
{
max = f[i];
}
}
return max;
}
};