NC19 子数组的最大累加和问题 参考Antrn的代码和想法!!!
题目描述 给定一个数组arr,返回子数组的最大累加和 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12. 题目保证没有全为负数的数据
方法一: 解题思路 对于求解子数组的最大累加和,一开始想到,用双重循环来求解,外层控制子数组的长度,内层求解子数组的和,这样很轻松求出题目要求的最大累加和。(但是!这个时间复杂度就变成n的平方,而且当数组很长的时候,会由于时间的限制不会通过测试)
解题代码
class Solution {//由于暴力循环,其时间复杂度为o(N^2),所以运行超时。
public:
int maxsumofSubarray(vector<int>& arr) {
int m=0;
for(int i=1;i<=arr.size();i++)//这一层是子数组包含的个数
for(int j=0;j<=arr.size()-i;j++)//第二层循环
{
int m1=0;
for(int k=j;k<j+i;k++)m1+=arr[k];//一个小循环,计算子数组的和
m = max(m,m1);
}
return m;
}
};
复杂度分析 时间复杂度:由于是两层循环,因此时间复杂度为( ),但超过了在线测试的时间限制,不可行。 空间复杂度:对于暴力求解,没有引入新的地址空间,因此空间复杂度为
方法二: 解题思路 (借鉴Antrn的思想,动态规划)Antrn在求解这道题目的时候,就是对于子数组,在从头开始遍历的时候,只要我已有的数组在加上下一个数的时候不减,这样我就一直加,就这样,一层遍历,直接求出最大的数组。 解题代码
class Solution {
public:
int maxsumofSubarray(vector<int>& arr) {
int m = arr[0]; // 保存最大累加和,在Antrn代码的基础上修改,然后通过第7个测试组
for(int i = 1 ; i<arr.size() ; i++)
{
arr[i] = max(arr[i] , arr[i-1]+arr[i]);
m = max(m, arr[i]);
}
return m;
}
};
复杂度分析 时间复杂度:由于是一次遍历,因此时间复杂度为 空间复杂度:和暴力求解一样,没有引入新的地址空间,因此空间复杂度为