[C++] LeetCode 123. 株の売買に最適なタイミングIII
2221 ワード
タイトル
配列があると仮定します.i番目の要素は、i日目の株の価格です.最大の利益を見つけるためのアルゴリズムを設計します.最大2つの取引を完了することができます.注意:複数の取引に同時に参加してはいけません(再購入する前に前の株を売却しなければなりません).
問題解
この問題は1~2回取引できることを要求している.
方法2
配列があると仮定します.i番目の要素は、i日目の株の価格です.最大の利益を見つけるためのアルゴリズムを設計します.最大2つの取引を完了することができます.注意:複数の取引に同時に参加してはいけません(再購入する前に前の株を売却しなければなりません).
問題解
この問題は1~2回取引できることを要求している.
maxNum[i]
日目から最終日までの最大取引価格は、まず1つの配列i
で表される.では、i
日目を取引先とし、1つの変数保存前のi-1
日の最低価格を維持し、購入または売却の2つの状況を考慮します.1、当日購入すれば前のi
日の最大利益を得ることができる場合、総最大利益は当日売り利益に加えて後の最大利益となるが、ここでは後の利益を考慮する必要はなく、この場合は後の日に考慮される.2、当日の購入で前のi
日の最大利益が得られない場合は、当日の販売を考慮して、総最大利益を計算します.たとえば、prices={1,2,5,3,4,6}
、1
日目の株価は1
です.3
日目の売上最大利益は(5-1)+(6-3)
で、4
日目の最大利益も(5-1)+(6-3)
であることがわかるので、上記の1
で述べたように、当日の売上の場合、現在の最大利益のみを考慮し、後のことは考慮しないと説明した.後の最大利益を合わせると、次の日に考えられるからです.class Solution {
public:
int maxProfit(vector& prices) {
int n=prices.size();
if(n<2) return 0;
vector maxNum(n,0);
maxNum[n-1]=prices.back();
for(int i=n-2;i>=0;i--){
maxNum[i]=max(prices[i],maxNum[i+1]);
}
int minp=prices[0],profit=0,maxprofit=0;
for(int i=1;iprofit){
profit=prices[i]-minp;
maxprofit=max(maxprofit,profit);
}
else{
maxprofit=max(maxprofit,profit+maxNum[i]-prices[i]);
}
if(minp>prices[i]) minp=prices[i];
}
return maxprofit;
}
};
方法2
profit[i]
は、第i
日に1回の取引で得られる最大収益を表し、第1回の遍歴はprofit
を計算し、第2回の逆順遍歴では、2回の取引の最大利益は前のi-1
日の利益に後の最大利益を加え、現在得られる最大利益コードである.class Solution {
public:
int maxProfit(vector& prices) {
if(prices.empty()) return 0;
int n=prices.size(),minprice=prices[0],maxprofit=0;
vector profit(n,0);
for(int i=1;i0;i--){
res=max(res,profit[i-1]+max(0,maxprice-prices[i]));
maxprice=max(maxprice,prices[i]);
}
return res;
}
};