描述
给定一个长度为 n 的数组 arr ,返回其中任意子数组的最大累加和。(没有全部是负数的情况)
解答思路:
首先要明确:什么是数组的子数组?我一开始以为是所有元素的排列组合(即可以不连续),所以使用了贪心算法,收集了所有正数元素,返回然后累加和,结果当然是不正确的。。。
数组的子数组是连续的,即下标连续的一串数据,最大长度等于母数组。
解法:
这道题可以分析出:从首项开始遍历数组求累加和,每一次都将sum和0、ret和sum比较,取较大值。
如果累加和sum小于0,那么说明此项之前的子数组是对整体累加有害的,应该舍弃。反之这是有利的,可以保留,但是不是最大还需要和最大和ret相比较,取两者较大值来确定。
如此,遍历一遍后,即可求得子数组最大累加和。
代码:
class Solution {
public:
int maxsumofSubarray(vector<int>& arr) {
/** 累加和*/
int sum = arr[0];
/** 最大累加和*/
int Ret = arr[0];
for(int i=0;i<arr.size();i++)
{
sum = max(sum,0) + arr[i];
Ret = max(Ret,sum);
}
return Ret;
}
};