关于此题我的往期文章:
leetCode 53.最大子数和 图解 + 贪心算法/动态规划+优化_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/13349726853. 最大子数组和 - 力扣(LeetCode)
>>思路和分析
子数组:其实就是连续的子序列
其实指的就是它的子数组的最大和,子数组其实就是连续的子序列。也就是在数组里边,找到一个连续的子序列,它的和一定是所有的连续子序列里边最大的,最后把这个和输出来。
>>动规五部曲
1.确定dp数组(dp table)以及下标的含义
2.确定递推公式
重要关键词:“延续”和 “不延续”
故dp[i]只有两个方向可以推出来
一共就这两种情况,取它们的最大值,所以dp[i] = max(dp[i-1]+nums[i],nums[i]);
3.dp数组初始化
从递推公式可知,dp[i] 依赖于 dp[i-1] 的状态,dp[0]是递推公式的基础
因此可统一初始化dp数组为0,dp[0]单独赋值,即
4.确定遍历顺序
5.举例推导dp数组
- class Solution {
- public:
- // 动态规划
- int maxSubArray(vector<int>& nums) {
- if(nums.size() == 0) return 0;
- vector<int>dp(nums.size(),0);
- dp[0] = nums[0];
- int result = dp[0];// 注意点!
- for(int i=1;i
size();i++) { - dp[i] = max(dp[i-1]+nums[i],nums[i]);// 状态转移公式
- if(dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值
- }
- return result;
- }
- };
>>优化空间复杂度
- class Solution {
- public:
- // 动态规划 优化空间复杂度
- int maxSubArray(vector<int>& nums) {
- if(nums.size() == 0) return 0;
- vector<int>dp(2,0);
- dp[0] = nums[0];
- int result = dp[0];// 注意点!
- for(int i=1;i
size();i++) { - dp[i % 2] = max(dp[(i-1) % 2]+nums[i],nums[i]);// 状态转移公式
- if(dp[i % 2] > result) result = dp[i % 2];// result 保存dp[i]的最大值
- }
- return result;
- }
- };
来自代码随想录课堂截图:
参考和推荐文章、视频:
看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV19V4y1F7b5/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3推荐我的往期文章:leetCode 53.最大子数和 图解 + 贪心算法/动态规划+优化_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133497268