LintCodeブラシの問題---最大のサブアレイ

説明:

  整数の配列を考えると、最大のものを見つけると、サブアレイを有し、その最大値を返します。

 

例:

  入力:[-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 ;.合計+ = NUM​​S探し[i]が負の最大があります。   

おすすめ

転載: www.cnblogs.com/S-Evildoer/p/10962947.html