写在前面

  • 数据结构预算法思想之动态规划
  • 解决多阶段决策过程最优化问题的一种常用方法。两个重要性质:
  • 最优子结构
  • 重叠子问题
  • 谈谈动态规划的思想
  • 看了一些博文解释的不合理,特记录1个
  • 有了思想钥匙,必定打开问题之门!!!

题目详情

  • 53.最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

进阶:
如果你已经实现复杂度为 O(n)

ac代码

  • 核心思想(动态规划)
  • 扫描法—O(N)
  • 加1个正数,和增加;
  • 加1个负数时,和减少。
  • 如果当前和是负数,那么这个和在接下来累加中应该抛弃并置零,不然负数将会减少接下来的和,影响局部最优子结构。
  • 针对数组全为负数情况,相当于求解所有元素中最大的负数值
class Solution
{
public:
int maxSubArray(vector<int>& nums)
{
int sum = nums[0], maxs = nums[0];
for(int i=1; i<nums.size(); i++)
{
if(sum > 0)
sum += nums[i];
else
sum = nums[i];
if(sum > maxs)
maxs = sum;
}
return maxs;
}
};
  • 测试代码
#include<iostream>
#include<vector>
using namespace std;

int maxSubArray(vector<int>& nums)
{
int sum = nums[0], maxs = nums[0];
for(int i=1; i<nums.size(); i++)
{
if(sum > 0)
sum += nums[i];
else
sum = nums[i];
if(sum > maxs)
maxs = sum;
}
return maxs;
}

int main()
{

vector<int> nums =
{
-2,-1,-3,-4,-1,-2,-1,-5,-4
};
cout << maxSubArray(nums) << endl;

return 0;
}
  • 参考
  • 【LeetCode】53. 最大子序和 (C++)