法一:动态规划 可以解决求最大值问题,寻找最大子序列和。
对于每一个nums[i]有两个选择(1.与前面子数组合并 2.不合并):判断nums[i]本身与以nums[i]与前面最大子序列之和(dq[i-1]+nums[i])的大小,取较大的数,放入dq[i]中。然后取数组dp中最大的数。
dq数组存放的就是以i位置为尾的最大子序列之和。
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
int len = nums.size();
int dq[len];
int maxnum = nums[0];
dq[0] = nums[0];
for(int i = 1;i<len;i++)
{
dq[i] = max(dq[i-1] + nums[i],nums[i]);
maxnum = max(maxnum,dq[i]);
}
return maxnum;
}
};
改进一下,用last_max滚动替代代替数组dq;
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
int len = nums.size();
int maxnum = nums[0];
int sum = 0;
int last_max = 0;
for(int i = 0;i<len;i++)
{
sum = last_max + nums[i];
last_max = max(sum,nums[i]);
maxnum = max(maxnum,last_max);
}
return maxnum;
}
};