1.题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。
今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。
但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?
例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
2.代码展示
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int sum=array[0],num=0,max=INT_MIN;
int flag=0;
for (int i=0; i<array.size(); ++i){
num+=array[i];
if (num>sum&& num>0){
sum=num;
flag=1;
}
if (num<0){
if (num>max){
max=num;
}
num = 0;
}
}
return flag>0?sum:max;
}
};
3.解题思路
首先要保证sum里面一定是正数并且最大,所以当一段子区间的和大于sum的值时,我们要更新sum,如果小于那么我们就不更新,那么当之前遍历所有子序列的和小于0时,那么一定是会使得前半段或者后半段要给它补,所以我们要以此为新结点,去遍历剩下的值时候有比之前存的值大,如果有就更新,没有就继续找,找不到就返回sum;我们要注意全部为负数的情况,设置一个标志,如果sum存在大于0的值,我们一定是输出sum,但是没有的话,我们要输出负数中的最大值,所以要存起来,我们定义一个max变量,值为最小值,大于它就存起来,所以它一定存储的是负数中的最大值。
4.心得体会
一定要理解题意,最开始解题的时候,以为是必须从0开始记数,导致错误,另外要分清楚所有情况,解题就更快了。