剑指offer 030、连续子数组的最大和
题目
题解
显然这是一道动态规划的题目
先看第一种解法
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
if (array.size() == 0) return 0;
int maxNum = array[0];
for (int i = 1; i < array.size(); ++i) {
array[i] = max(array[i], array[i - 1] + array[i]);
maxNum = max(maxNum, array[i]);
}
return maxNum;
}
};
由于有些题目要求不能修改原数组,而dp列表中dp[i] 只和 dp[i - 1]有关,所以创建两个变量循环利用即可。
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
if (array.size() == 0) return 0;
int max = array[0];
int pre = 0; // 记录dp[i - 1]的值
int cur = array[0]; // 记录dp[i]的值
for (auto x : array) {
cur = x;
if (pre > 0) cur += pre;
if (cur > max) max = cur;
pre = cur;
}
return max;
}
};