一、题目
题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
示例1
输入
[1, -2, 3, 5, -2, 6, -1]
返回值
12
二、思路
1、动态规划,新建一个一维数组储存累加和,每次累加时判断前面累加和是否为负,如果为负及时丢掉前面的
2、注意第一个数,有可能第一个就是满足条件那个,因为for循环是从1开始的,所以会把第一个数漏掉
三、代码
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int maxsumofSubarray(vector<int>& arr) {
// write code here
//dp[i]代表到第i位的时侯,以arr[i]结尾的连续子数组最大累加和
int dp[arr.size()];//开辟dp
dp[0] = arr[0];//初始化
int res = arr[0];//保存最终的结果
for(int i = 1;i < arr.size();i ++){
dp[i] = max(arr[i],dp[i-1] + arr[i]);//维护dp[i]
res = max(res,dp[i]);//每更新一个dp值就更新一下res
}
return res;
}
};