i番目の要素が与えられた株式のi日の価格である配列を、与えられました。
あなたが得ることができる最大の利益を計算するアルゴリズムを設計します。あなたは、可能な限り(株式を売買)より取引を閉じることができます。
注:同時に複数のトランザクション(あなたは秋の前に再び株式を購入する前に売却しなければならない)に関与することはできません。
例1:
入力:[7,1,5,3,6,4]
出力:7
説明:2日目(= 1つの株価)、買って、3日目(株価= 5)で販売する場合、この取引は= 5-1 = 4を利益を得ることができます。
売り切れの際はその後、5日目(株価= 6)で購入し、4日目(株価= 3)に、この取引は= 6-3 = 3を利益を得ることができます。
例2:
入力:[1,2,3,4,5]
出力:4を
説明する:(株価= 1)売却したときに、5日目(株価= 5)に、1日目に購入する際、これを取引所は、利益= 5-1 = 4することができます。
あなたは、彼らが販売されて、その後の後、1日2一連の株式を購入することができないことに注意してください。
それは複数のトランザクションに関与し、同じ時間に属しているので、あなたは再び購入する前に秋の前に在庫を売却しなければなりません。
例3:
入力:[7,6,4,3,1]
出力:0を
説明する。この場合、トランザクションが完了していない、最大の利益はゼロです。
方法
アルゴリズムはとして直接限り大今日は昨日よりも簡略化することができ、maxprofitを計算します。
2つのケースがあります:(1)アップダウンに変更し、(2)低、高販売する最後の、~~の(3)レベル、低購入するのは初めて。
1 // 利点の観点から計算 2 クラスソリューション{ 3 公共: 4 int型 MAXPROFIT(ベクトル< INT >&価格){ 5 int型 MAXPROFIT = 0 ; 6。 // 各ループは私を見つけるために見つけるために、セル室を探している++次の間隔 。7 用(INT I = 1 ; Iは<prices.size();私は++ ){ 8は // )(price.sizeをI = 0ラインサイクルが始まるが、price.size()は、符号なしのタイプを返します- 1は、実質的に無限大である 9。 IF(価格[I]>料金[I - 1 ]) 10 MAXPROFIT + =料金[I] -料金[I -1 ]。 11 } 12 リターンmaxprofit。 13 } 14 }。
1 // 同じ考え方 2 クラスソリューション{ 3。 公共: 4 int型 MAXPROFIT(ベクトル< INT >&価格){ 5 IF(prices.size()< 2)戻り 0 ; 6 INT I = 0 ; 7 INT MAXPRO = 0 ; // 最大の利益を 8人の。 INTバレー料金= [ 0 ]; // 谷 。9 int型のピーク=料金[ 0 ]; // ピーク 10 ながら(iはprices.sizeを()< - 1 ) 11 { 12 ながら(i)は(prices.sizeを< - 1つの &&価格[I + 1 ] <= 価格[I]) 13 I ++ 。 14 谷= 価格[i]は、 15 一方、(iが(<)prices.sizeを- 1つの &&価格[I + 1 ]> = 価格[I]) 16 I ++ 。 17 ピーク= 価格[i]は、 18 maxpro + =ピーク- 谷。 19 } 20 リターンmaxpro; 21 } 22 }。