leetcode-53.最大子序和刷题笔记(c++)
原创
©著作权归作者所有:来自51CTO博客作者nkgines的原创作品,请联系作者获取转载授权,否则将追究法律责任
写在前面
- 解决多阶段决策过程最优化问题的一种常用方法。两个重要性质:
- 谈谈动态规划的思想
- 看了一些博文解释的不合理,特记录1个
题目详情
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
进阶:
如果你已经实现复杂度为 O(n)
ac代码
- 加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++)