给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
思路:
状态表示为f[i] 以nums[i] 结尾的子数组和 属性为Max
集合划分为 长度是否大于1 如果不大于1就是nums[i]本身
否则是 f[i-1] + nums[i]
f[i] =max(f[i], f[i-1] + num[i])
代码:
class Solution {
public:
vector<int> f;
const int Inf=-(1e4+10);
int maxSubArray(vector<int>& nums) {
int n=nums.size();
//f=vector<int>(n);
int res=Inf;
//O(N^2) 过不了
//由于f[i]=max(f[i],f[i-1]+nums[i])
//所以可以开一个新的变量存上一个的f[i-1] 达到O(n)级别
for(int i=0,last=0;i<n;i++){
//如果上一个last是负的 那其实应该重新开一个序列 开始的是nums[i]
//last=nums[i]+max(last,0);
last=max(nums[i],nums[i] + last);
//last=f[i];
res=max(res,last);
}
return res;
}
};
评论区