連續子數組的最大和(牛客)

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開始記數,導致錯誤,另外要分清楚所有情況,解題就更快了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章