トピック住所: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でした。
問題解決のためのアイデア
貪欲なアイデア: 私たちは、それが継続的蓄積過程での最も可能性が高いと思いますし、この問題を解決するために貪欲なアイデアを使用します。累積和が最終的な結果は、次の番号から再び開始するには、負の寄与であり、累積和が正の寄与を示す、ゼロより大きい場合、最大値を更新したことを示す、0未満である場合、次の値が加算されると、そして、、同時に最大値を更新します。
問題解決のためのソース
ダイナミックプログラミング
クラスのソリューション{ パブリック: int型(最大のint、int型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を。 } }。