AcWing 55. 连续子数组的最大和
宋标 Lv5

题目

输入一个 非空 整型数组,数组里的数可能为正,也可能为负。

数组中一个或连续的多个整数组成一个子数组。

求所有子数组的和的最大值。

要求时间复杂度为

数据范围

数组长度
数组内元素取值范围

样例

输入:[1, -2, 3, 10, -4, 7, 2, -5]

输出:18

题解

dp: 状态转移:f[i] = max(f[i - 1] + nums[i], nums[i]);
前一个子数组的最大和加上当前值与当前值比较
dp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:

int f[1010];

int maxSubArray(vector<int>& nums) {
int res = INT_MIN;
for (int i = 0; i < nums.size(); ++ i)
{
f[i + 1] = max(f[i] + nums[i], nums[i]);
res = max(res, f[i + 1]);
}
return res;
}
};

空间优化

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = INT_MIN, s = 0;
for (auto x : nums)
{
if (s < 0) s = 0;
s += x;
res = max(res, s);
}
return res;
}
}
 评论