【leetcode】53. 最大子序和
题目内容
思路分析
本题比较简单,可使用动态规划完成
方法一:动态规划
最大子序列和有以下特征:
nums[i]的最大子序列和等于max(nums[i-1]的最大子序列和加nums[i], nums[i])
因此nums[i]可利用nums[i-1]的计算结果,即可进行动态规划。
使用动态规划算出每个nums[i]的子序列和,最后取最大子序列和即可。
又因为只依赖上一个数字的计算结果,因此可以用一个pre变量来代替动态规划数组。
代码
#include <vector>
#include <math.h>
#include <limits.h>
using namespace std;
// 动态规划
// 时间复杂度O(n),只需遍历一次数组
// 空间复杂度O(1),额外存储空间为常数
class Solution1 {
public:
int maxSubArray(vector<int>& nums) {
int max_sum = nums[0];
int pre_max_sum = nums[0];
for (int i = 1; i <nums.size(); ++i) {
pre_max_sum = max(pre_max_sum+nums[i], nums[i]);
max_sum = max(pre_max_sum, max_sum);
}
return max_sum;
}
};
// 贪心算法
// 好吧感觉也并没有贪什么,和动态规划法差不多吧
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max_sum = nums[0];
int sum = nums[0];
for (int i = 1; i<nums.size(); ++i) {
sum = max(sum, 0);
sum += nums[i];
max_sum = max(sum, max_sum);
}
return max_sum;
}
};
int main() {
Solution s;
int result;
vector<int> input{ -2,1,-3,4,-1,2,1,-5,4 };
result = s.maxSubArray(input);
int a = 0;
}
收获
- 简单复习了下动态规划(但是遇到这种简单题还是不会用动态规划,还是得看答案?)