安全プランを証明する:最大連続サブアレイと(Javaの)

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

      例えば、入力配列は{1、-2,3,10、-4,7,2、-5}であり、{3,10サブアレイ、-4,7,2}の最大、そのサブための出力18のアレイ。

     すなわち、配列のすべてのサブ配列を列挙し、それらを見つけるために、多くの人々が最も直感的な方法を考えることができ、トピックを参照してください。長さnの配列、Nの合計(N + 1)/ 2サブアレイ。全てのサブアレイを計算し、また、最速のO(N)時間を要します。通常、最も直感的な方法が最善の方法ではありません、インタビュアーがより高速な方法を私たちに促すメッセージが表示されます。

解決策1:例の配列規則性

     私たちは、頭と尾からアレイ内の各サンプルについて、個別に蓄積された数字を試してみました。ステップ0で初期化し、最初の番号を追加し、1次ステップデジタル場合について-2、-1プログラム。我々はデジタル注意3ステップこの蓄積された前-1未満0、-1 3を添加し、そしてそれ自体よりも2、3より小さいが得られた場合。開始および最初の数からそのサブ配列は、3桁目の先頭からサブアレイよりも小さくなります。したがって、我々は最初のサブ配列を考慮していない、とも放棄される前に蓄積されました。

    我々は、第三の累積数から再び起動この時点で取得され、第四のステップ3.次に、10を追加し、13第五のステップは、取得して追加することで-4、および9我々はそれが負であることが見出さ-4こうして蓄積-4、元未満の後に得られました。我々はプットを得る前に13、したがっては保存、それが最大のサブアレイいる可能性があります。結果デジタル7,9第6のステップは、16 + 7であり、そして以前より、この時間と最大13より大きい時、最大のサブアレイ2を追加の13〜16第7のステップ、累積更新され得られた18と、同時に、我々は、サブアレイを更新し、最大なければなりません。最終的な最大のサブアレイ18は、サブアレイは、{3,10、4,7に対応されるようにして得られた結果ので第8のステッププラス最後の桁は、-5、13、最大値と以前に得られた18未満であります、2}。

 public Integer findGreatestSum(int[] arr){  
          
        if(arr.length ==0)  
            return null;   
        int greatest = 0x80000000;  
        int curSum = 0;  
        for(int i = 0;i<arr.length;i++){  
            if(curSum <= 0)  
                curSum = arr[i];  
            else  
                curSum += arr[i];  
            if(curSum >greatest)  
                greatest = curSum;  
        }  
        return greatest;  
    }  

溶液II:動的プログラミングの応用

    また、動的なプログラミングのアイデアは、問題は適用分析することができます。終了時に、i番目のサブ配列と最大数で表現した場合、我々はここで、0 <= I <Nの関数f(i)で、最大[(I)F]を見つける必要があります。我々は、次の再帰的な公共をf(i)を求めることができます使用することができます。


    式の意味:番号の最初のサブ配列は、I-1と端が0以上であり、i番目の桁自体よりも小さい全ての数値のi番目の負の蓄積をもたらす場合したがって、この場合には、i番目のサブ・アレイは、i番目の桁自体の末尾の数字です。i番目のサブアレイの数値は、i番目の桁の最後に得られ、すべての数字されると、すべての数字がで終わる最初のi-1桁サブアレイは、0よりも大きい場合。


公開された118元の記事 ウォン称賛35 ビュー120 000 +

おすすめ

転載: blog.csdn.net/abc7845129630/article/details/52738701