LeetCode 53. 最大子序和
解题思路:使用动态规划。开一个状态数组dp[n],dp[i]代表到i为止的最大子序和。考虑dp[i - 1]和dp[i]之间的关系,即已知到第i - 1为止的最大子序和,如何得到第dp[i]。
转移关系为:dp[i] = max(dp[i - 1] + nums[i], nums[i])
前面的子序和如果是负数的话,加上当前nums[i]会造成子序和变小,此时dp[i]直接为当前nums[i]。
代码实现上,给出了普通的动态规划实现,和使用滚动数组优化的代码实现。
//普通动规实现
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (1 == nums.size()) return nums[0];
//初始化
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
//状态转移
for (int i = 1; i < nums.size(); ++i) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
}
auto maxSum = max_element(dp.begin(), dp.end());
return *maxSum;
}
};
//滚动数组优化
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSum = nums[0], pre = 0;
for (const auto &x : nums) {
pre = max(pre + x, x);
maxSum = max(maxSum, pre);
}
return maxSum;
}
};