説明:
整数の配列を考えると、最大のものを見つけると、サブアレイを有し、その最大値を返します。
例:
入力:[-2、2、-3、4、-1、2、1、-5、3]
出力:6
説明:サブアレイのニーズに合わせ[4、-1、2、1]、及び6の最大
問題解決:
難しさ:配列注3例がありますが、すべてのすべて、正正または負、負です。
また、注目すべきは、ここでは最大規模のサブアレイは、息子の最大の連続配列であるということだった、ではないランダムな組み合わせが最大のサブアレイました
問題を解決するには、2つの方法:
1.暴力的な問題解決:すべての最大のサブアレイを介して2つのサイクルが直接ました。
公共 int型 maxSubArray(int型[] NUMSを){ // ここにコードを記述する int型 MaxSum = NUMS [0 ]; 以下のために(int型 i = 0; iはnums.length <; iは++ ){ int型の和= 0 。 用(int型 J = I; J <nums.length; J ++ ){ 合計 + = NUMS [J]。 もし(合計> MaxSum){ MaxSum = 和。 } } } 戻りMaxSumと、 }
アルゴリズム分析:
第サブアレイと最初の配列の最大数を定義し、第一層は、最大サブアレイの終わりを見つける最大サブアレイ、第二層ループのサイクルの開始を見つけることです。
第二層ループサブアレイはまた時間及びサブアレイがMaxSum =和を変更する、MaxSumより大きい場合、計算され;
第二の溶液:
分割統治???
実際、単純なコード、時間複雑度は、O(N)であります
公共 int型 maxSubArray(int型[] NUMSを){ // ここにコードを記述する int型 MaxSum = NUMS [0 ]; int型の合計= 0 ; 以下のために(int型 ; iはnums.length <I ++は、I = 0 ){ 合計 + = NUMS [I]を、 もし(合計> MaxSum){ MaxSum = 和。 } もし(合計<0 ){ 和 = 0。// 子串和为负数、丢掉 } } を返すMaxSumを。 }
アルゴリズム分析:
また、1サイクルの間、最大サブアレイと最初の配列を定義し、直接計算の和が、いつ、直接オフ負であります
でも、最初から再びフルタイム負の、合計= 0 ;.合計+ = NUMS探し[i]が負の最大があります。