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; } };
复杂度分析
时间复杂度:由于是一次遍历,因此时间复杂度为
空间复杂度:和暴力求解一样,没有引入新的地址空间,因此空间复杂度为