一、题目
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
示例1
输入
[1, -2, 3, 5, -2, 6, -1]
返回值
12
二、题解
S1:定义一个大小与arr相同的数组dp,其中dp[i]的值代表到第i位的时候,以arr[i]结尾的连续子数组的最大累加和;
S2:计算dp[i]的值。当i=0时,dp[i] = arr[0]; 当i != 0时,dp[i] = max(0, dp[i-1]) + arr[i], (此时若dp[i-1] <= 0时,dp[i] = arr[i], 当dp[i-1] > 0时,dp[i] = dp[i-1] + arr[i] )
S3:最后返回值为dp数组中最大的值。
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int maxsumofSubarray(vector<int>& arr) {
// write code here
int res;
int n = arr.size();
vector<int> dp;
for(int i=0;i<n;i++){
if(i == 0){
//dp[i] = arr[i];
dp.push_back(arr[i]);
}
else{
if(dp[i-1] > 0){
//dp[i] = dp[i-1] + arr[i];
int temp = dp[i - 1] + arr[i];
dp.push_back(temp);
}else{
//dp[i] = arr[i];
dp.push_back(arr[i]);
}
}
}
sort(dp.begin(),dp.end());
res = dp[n-1];
return res;
}
};
他人优秀代码
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int maxsumofSubarray(vector<int>& arr) {
// write code here
int n = arr.size();
int dp[n];
dp[0] = arr[0];
int res = dp[0];
for(int i=1;i<n;i++){
dp[i] = max(0,dp[i-1]) + arr[i];
res = max(res,dp[i]);
}
return res;
}
};