状态转移:f[i] = max(f[i-1], 0) + nums[i]。f[i]可划分为两部分,以第 i -1个元素结尾的所有连续子数组加上第i个元素,或者只选用第 i 个元素。答案为所有f[i]中的最大值。
优化:由于f[i] 在计算时只会用到f[i-1],则sum在第(i - 1)轮循环得到的结果即为f[i-1],第 i 轮循环使用的sum即为f[i-1]。
classSolution{
public:intmaxSubArray(vector<int>& nums){
int ans = nums[0], sum = nums[0];for(int i =1; i < nums.size(); i ++){
sum =max(sum,0)+ nums[i];
ans =max(ans, sum);}return ans;}};