動態規劃——030連續子數組的最大和

1,問題描述

HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。給一個數組,返回它的最大連續子序列的和,你會不會被他忽悠住?(子向量的長度至少是1)

2,解題思路

(1)構建一個虛擬數組(實際上並不存在)用於存放和最大的連續子數組,設輸入數組第一個元素爲最大值,遍歷輸入數組剩餘元素並依次放入虛擬數組中,在放入虛擬數組之前,先判斷虛擬數組中已有元素之和,如果和小於等於0,那麼該連續子序列就會對後邊的元素產生負影響,那我要你有何用,直接拋棄掉這些元素;此時的虛擬數組爲空,接着將新的元素放入該虛擬數組,接着向後遍歷元素;同時,每遍歷一個元素,需要判斷一下虛擬數組中所有元素之和與現有最大值的關係。

(2)時間複雜度O(n),空間複雜度O(1)

3,源碼

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        int sum = array[0];//連續子序列之和
        int max = array[0];//用於記錄最大值
        for(int i=1;i<array.length;i++){
            //如果sum<= 0,說明位置i之前的元素之和對後面的元素產生負影響或者沒有影響,
            //那麼就需要拋棄之前的連續子序列, 否則,保留之前的連續子序列以及其和,接着向後遍歷
            if(sum <= 0){
                sum = array[i];
            }else{
                sum += array[i];
            }
            
            if(sum > max){
                max = sum;
            }
        }
        
        return max;
    }
}

 

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