连续子数组的最大和(牛客)

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开始记数,导致错误,另外要分清楚所有情况,解题就更快了。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读