説明
i番目の要素が与えられた株式のi日の価格である配列を、与えられました。
あなただけあなたが得ることができる最大の利益を計算するアルゴリズムを設計するために、(つまり、株式を売買する)トランザクションを完了するまで許可されている場合。
あなたが株式を購入する前に株式を売却することはできません。
例1:
入力:[7,1,5,3,6,4]
出力:5
説明:2日目(= 1つの株価)、売り切れの際は、5日目(株価= 6)に、購入します、最大の利益= 6-1 = 5。
販売価格は購入価格よりも大きくなければならないので、利益は、7-1 = 6ではないことに注意してください。
例2:
入力:[7,6,4,3,1]
出力:0を
説明する。この場合、トランザクションが完了していない、最大の利益はゼロです。
解決
概念
まず、最小を見つけ、その後、後ろに最小に最大値を見つけます。
最小値の間に変更されることがあり、その違いが変更されます。
ダイナミックプログラミング
リファレンスと連続サブアレー。
その解決策:
[i]が最大とサブアレイ端添字の要素を示している一次元アレイDPを使用してI、すなわちサブアレイは、最後の要素iは要素に対して低く、サブアレイは、すべてのI subを終了しています配列、および最大。
この場合、2つのケースがあり、
- DP場合は[I - 1] <0の場合、[I] = NUMS [I]をDP。
- もしDPは[I - 1] [ - 1 I] + NUMS [I]> = 0の場合、DP [i]はDP =。
公共 INT maxSubArray(INT [] NUMS){ int型のn = nums.length。 INT DP = NUMS [0 ]。 int型の最大値= NUMS [0 ]; 以下のために(int型 i = 1; iがn <; iは++ ){ DP = Math.max(DP + NUMS [i]は、NUMS [I])。 最大 = Math.max(MAX、DP)。 } 戻り最大。 }
この質問のために我々は上部の問題に変換することができます。
毎日株価を表す1628の配列のために。
どのような変換ルールの定義、現在の日の価格を引い表すために使用される前日の価格、ゼロに規定がない場合の最初の日の前日には、動作しません。
アレイは05から46である06-12-68-2、に変換されます。配列を意味することは、今のは、変更前の日に比べて株式となります。
今、私たちは53の質問になっている、それを最大と連続しているどのくらいのを見つける必要があります。
連続して、このような3〜6日との対応まで追加し、売買への対応は、実際に購入して二日目で、6日販売。
つまり、売買と互いに連続してマップを形成し、その問題の成功の変換で。
コードはトップに基づいてどのようなことができます変更します。以下に。。
コード
概念
公共 INT maxProfit(INT []価格){ 場合(ヌル ==価格|| prices.length <2 ){ 戻り 0 ; } INT分= Integer.MAX_VALUEで、 int型のres = 0 ; 以下のために(int型 i = 0; iはprices.length <; iは++ ){ int型値= 価格[I]; もし(値< 分){ 分 = 値。 } それ以外の 場合(値-分>RES){ RES =値- 分。 } } 戻りRES。 }
ダイナミックプログラミング
パブリック 静的 INT maxProfit(INT []価格){ int型 DP = 0 。 int型の最大= 0 ; 以下のために(int型 i = 1; iはprices.length <; iは++ ){ int型の CHA =価格[i]は-価格[I - 1 ]。 DP = Math.max(DP + CHA、CHA)。 最大 = Math.max(MAX、DP)。 } 戻り最大。 }