剑指Offer:30 连续子数组的最大和(最大子列和)
最大子列和问题,陈越老师的数据结构课第一节里就讲过,照着原来的代码写一遍发现出了问题:
1、一开始忘了初始化maxSum,导致里面是一个随机且很大的数,所以出错。
2、处理了问题1之后,只通过了1/3的case,原因是都为负数的时候返回值为0。
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int n = array.size();
if(array.empty()) return 0;
int thisSum =0, maxSum = 0;
for(int i=0; i<n; i++)
{
thisSum += array[i];
if(thisSum > maxSum){
maxSum = thisSum;
}
else if(thisSum<0){
thisSum = 0;
}
}
return maxSum;
}
};
照搬原来的代码行不通了,需要在原来的代码基础上改进。
看了书上的动态规划的思路,对之前的“在线式”算法,作了一些改动,即可通过。
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int n = array.size();
if(array.empty()) return 0;
int curMaxSum =array[0], maxSum = array[0];
for(int i=1; i<n; i++)
{
if(curMaxSum<=0){
curMaxSum = array[i];
if(maxSum<array[i]) maxSum = array[i];
}
else{
curMaxSum += array[i];
if(curMaxSum>maxSum) maxSum = curMaxSum;
}
}
return maxSum;
}
};
当然书上的代码写法更简洁,尤其是初始值选取的很恰当:
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int n = array.size();
if(array.empty()) return 0;
int curMaxSum = 0;
int maxSum = 0x80000000; //初始值设为32位int变量的最小值
for(int i=0; i<n; i++)
{
if(curMaxSum<=0)
curMaxSum = array[i];
else
curMaxSum += array[i];
if(curMaxSum>maxSum)
maxSum = curMaxSum;
}
return maxSum;
}
};