42が内接さ:最大連続サブアレイ及び(C ++)

トピック住所:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/

タイトル説明

整数配列を入力し、配列は、正にも負を持っています。一つまたはサブアレイからなる複数の連続整数配列。全てのサブアレイの最大値を求めると。所要時間はO(n)は、

トピックの例

例1:

入力:NUMS = [-2,1、-3,4、-1,2,1、-5,4]
出力:6
説明:連続サブアレイ[4、-1,2,1]であり、最大値は6でした。

問題解決のためのアイデア

動的プログラミング:我々は、動的プログラミングリストは、連続するサブ配列と最大の終了をF、NUMSのF(I)の代表的な要素[i]があると仮定する。F(I-1)<=とき被験者は、伝達方程式を得ることができる負の寄与、すなわちF(I)= F(I値がNUMS [I]のありません値が大きい場合、F(I)= NUMS [IまたはF(I)= F(I

貪欲なアイデア:  私たちは、それが継続的蓄積過程での最も可能性が高いと思いますし、この問題を解決するために貪欲なアイデアを使用します。累積和が最終的な結果は、次の番号から再び開始するには、負の寄与であり、累積和が正の寄与を示す、ゼロより大きい場合、最大値を更新したことを示す、0未満である場合、次の値が加算されると、そして、、同時に最大値を更新します。

問題解決のためのソース

ダイナミックプログラミング

クラスのソリューション{
 パブリックint型(最大のintint型B)
    {
        もし(> = B)を返します他の 
           リターンB;
    }
    INT maxSubArray(ベクトル< INT >&NUMS){
         場合(nums.size()< 1戻り 0 ;
        INTの和= NUMS [ 0 ]。
        以下のためにint型私は= 1 ; I <nums.sizeを(); I ++ 
        {
            もし(NUMS [I- 1 ]> 0 
            {
                NUMS [I] + = NUMS [I- 1 ]。
            } = MAX(NUMS [i]は、合計)。
        }
        戻り値の合計。
    }
}。

貪欲

クラス解決{
 パブリックINT maxSubArray(ベクトル< INT >&NUMS){
         場合(nums.size()< 1戻り 0 ;
        int型 resSum = INT_MIN。
        int型 curSum = 0 ;
        以下のためにint型私は= 0 ; I <nums.sizeを(); I ++ 
        {
            もし(curSum> 0 
            {
                ランナー + = NUMS [I]。
            }
            そうしないと
            {
                カーソル = NUMS [I]。
            }
            もし(ランナー> RESS)RESS = 速度;
        }
        返すresSumを。
    }
}。

おすすめ

転載: www.cnblogs.com/wzw0625/p/12571893.html