描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
数据范围:
要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)
进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)
题解1:规律分析
输入: [1,-2,3,10,-4,7,2,-5]
累加子数组和curSum分别为:1,-1,3,13,9,16,18,13
最大子数组和greaterSum为 1,1,3,13,13,16,18,18
所以,每当curSum<=0时候,curSum = array[i]
每当curSum<=0时候,curSum = curSum+array[i]
最后判断本次循环的值和上次子数组和谁大,那么greaterSum = max(curSum,greaterSum)
int FindGreatestSumOfSubArray(vector<int> array) {
// 根据题意,数据范围n>1,所以不用考虑输入无效的情况
int curSum = array[0];//记录累加的子数组和
int greaterSum = array[0];//记录最大的子数组和
for(int i =1;i<array.size();i++){
if(curSum <=0)
curSum = array[i];
else
curSum+=array[i];
if(curSum > greaterSum)
greaterSum = curSum;
}
return greaterSum;
}
题解2:动态规划
状态转移方程为:
当f(i-1)<=0,curSum = array[i]; 当f(i-1) >0,curSum =curSum + array[i];
动态规划最重要的是要记录上一次的值
int FindGreatestSumOfSubArray(vector<int> array) {
int curSum = 0;
int result = array[0];
for(int i =0;i<array.size();i++){
if(curSum <= 0)
curSum = array[i];
else
curSum +=array[i];
result = max(curSum, result);
}
return result;
}