トピック住所:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/
タイトル説明
配列に格納された時系列順に株式の価格は、どのような株式の売却は、最大の利益を得ることができますと仮定すると?
トピックの例
例1:
入力:[7,1,5,3,6,4]
出力:5
説明:2日目(= 1つの株価)、とき買い、5日目(株価= 6)、売り切れの際は、最大の利益= 6-1 = 5。
販売価格は購入価格よりも大きくなければならないので、利益は、= 6 7-1できないことに注意してください。
例2:
入力:[7,6,4,3,1]
出力:0を
説明する。この場合、トランザクションが完了していない、最大の利益はゼロです。
問題解決のためのアイデア
暴力:選択された初期値、再び横断列挙するために、すべての可能な結果の数のそれぞれについて選択された値を減算し、比較が、タイムアウトでこの方法をもたらします。
貪欲法:最大利益値を見つけるためにテールトラバーサル方法。次のように具体的なアイデアがあります
- STEP1:配列要素の値、現在の利益と最大利益curProfit値が0であるの終了をアレイ料最大価格を初期化します。
- ステップ2:curProfit <0の場合、現在の価格の価格[i]が大きいが、そのmaxPrice =価格[i]は、curProfitのそれ以外の場合は、我々値とmaxProfit、現在の価格への最高価格を更新した場合、利益の現在価値を計算するためのサイクルは、curProfit値、curProfit> maxProfitは、最大の利益を更新した場合、そのmaxProfit = curProfit
- ステップ3:最大利益値maxProfitを返します。
ダイナミックプログラミング:分析の問題、我々は二つの変数とMAXPROFIT損失を定義し、状態遷移方程式maxProfitによって最大値損益、利益を表し= MAX(maxProfit、価格[ i]が+損失) と状態遷移方程式損失の損失= maxは(損失、-prices [I] )反復最大利益値maxProfitが得られるように、継続的に更新します。
プログラムのソースコード
暴力行為(タイムアウトにつながります)
クラスのソリューション{
公衆:
int型maxProfit(ベクトル<整数>&価格){
もし(prices.size()<2)の戻り0; //株取引の不満2日
int型maxProfit = 0;
以下のために(; I <prices.size(); int型iが0を= I ++)
{
(; J <prices.size(); J ++のint J = I + 1)のために
{
int型curProfit =価格[J] - 価格[i]は、
もし(curProfit> maxProfit)
{
maxProfit = curProfit。
}
}
}
maxProfitを返します。
}
}。
貪欲な戦略
クラスのソリューション{
公衆:
int型maxProfit(ベクトル<整数>&価格){
もし(prices.size()<2)の戻り0; //株取引の不満2日
INT maxPrice =価格[prices.size() - 1]。
int型curProfit = 0;
int型maxProfit = 0;
用(INT I = prices.size() - 1; I> = 0; i--)
{
curProfit = maxPrice - 価格[i]は、
IF(curProfit <= 0)
maxPrice =価格[i]は、
そうしないと
{
もし(curProfit> maxProfit)
maxProfit = curProfit。
}
}
maxProfitを返します。
}
}。
ダイナミックプログラミング
クラスのソリューション{ パブリック: int型 MAXPROFIT(ベクトル< int型 >&価格){ IF(prices.size()< 2)の戻り 0 ; // 2日以内での株取引 int型 MAXPROFIT = 0、=損失-prices [ 0 ]; のため(INT I = 1 ; I <prices.size(); I ++ ) { MAXPROFIT = MAX(MAXPROFIT、価格[I] + 損失); //有益状態遷移方程式 損失 = MAX(ロス、 - 料金[I])。 //状態遷移方程式の損失 } 返すmaxProfitを。 } }。