BM72 连续子数组的最大和
知识点动态规划贪心
描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。数据范围:
要求:时间复杂度为 ,空间复杂度为
进阶:时间复杂度为
,空间复杂度为
示例1
输入:
[1,-2,3,10,-4,7,2,-5]
复制返回值:
18
复制说明:
经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18
示例2
输入:
[2]
复制返回值:
2
复制
示例3
输入:
[-10]
复制返回值:
-10
题解
动态规划
- 用dp数组表示以下标
为终点的最大连续子数组和
- 初始条件:dp[0] = array[0]
- 状态转移方程:dp[i] = array[i-1] > 0 ? (dp[i-1] + array[i]) : (array[i])
- 返回值:使用max_sum存放dp[i]中的最大值
注意:
- 时间复杂度:o(n)
- 空间复杂度:o(n),由于dp[i]只依赖于dp[i-1],因此可以将空间复杂度优化到o(1)
int FindGreatestSumOfSubArray(std::vector<int> array)
{
if (array.size() == 0)
{
return 0;
}
std::vector<int> dp(array.size(), 0);
dp[0] = array[0];
int max_sum = dp[0];
for (int i = 1; i < array.size(); ++i)
{
if (dp[i - 1] < 0)
{
dp[i] = array[i];
}
else
{
dp[i] = dp[i - 1] + array[i];
}
max_sum = std::max(max_sum, dp[i]);
}
return max_sum;
}