122. 株を売買するのに最適な時期 II - LeetCode
特定の株式の初日の 価格を表す prices
整数 の配列が与えられます 。prices[i]
i
毎日、株を買うか売るかを決定できます。いつでも 最大 1 株のみ保有できます 。最初に購入して、同日 に販売することもできます 。
あなたが得ることができる 最大の 利益を返します 。
例 1:
入力:価格 = [7,1,5,3,6,4] 出力: 7 説明: 2 日目に買い (株価 = 1)、3 日目に売り (株価 = 5) この取引からの利益= 5 - 1 = 4。 続いて、4日目に買って(株価=3)、5日目に売る(株価=6)とすると、この取引による利益は=6-3=3となります。 利益の合計は 4 + 3 = 7 です。
例 2:
入力:価格 = [1,2,3,4,5] 出力: 4 説明: 1 日目に買い (株価 = 1)、5 日目に売り (株価 = 5)、この取引からの利益 = 5 - 1 = 4。 合計利益は4です。
例 3:
入力:価格 = [7,6,4,3,1] 出力: 0 説明:この場合、トランザクションはプラスの利益を得ることができないため、トランザクションに参加しないことで最大の利益を得ることができ、最大利益は0.
>>アイデアと分析
- ①在庫は1個のみ
- ② 現在は株式の売買のみの運用となっております。
- ③利益を得たいなら最低でも2日を取引単位にする必要があります。
1. 貪欲なアルゴリズム
まず例を挙げてみましょう。たとえば、1 日目に買って (株価 = 1)、3 日目に売った (株価 = 10) 場合、この取引による利益は = 10 - 1 = 9 となります。利益は次のとおりです:価格[3] - 価格[1]
(価格[3] - 価格[2]) + (価格[2] - 価格[1])と 同等
このとき、利益は1 日目から 3 日目まで全体として考えるのではなく、日単位の単位に分解されます。
- 局所最適:毎日のプラスの利益を収集する
- Global Optimum :最大の利益を見つける
局所的な最適性は全体的な最適性につながる可能性があります。反例が見つからない場合は、貪欲になってみてください。
注:初日には利益はありませんが、少なくとも 2 日目には利益があるため、利益シーケンスは株価シーケンスより 1 日少なくなります。
上図から、毎日の利益のみが収集されていることがわかりますが、プラスの利益を収集する範囲は株式の取引範囲であるため、最終的な利益のみに注目する必要があり、範囲を記録する必要はありません。そして、プラスの利益だけを集めると、貪欲が入り込んでしまいます。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
};
- 時間計算量: O(n)
- 空間の複雑さ: O(1)
2.動的プログラミング
class Solution {
public:
// 动态规划 + 状态转移 时间复杂度:O(n) 空间复杂度:O(n)
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(len,vector<int>(2,0));
dp[0][0] -= prices[0];
dp[0][1] = 0;
for(int i = 1;i < len; i++) {
dp[i][0] = max(dp[i-1][0],dp[i-1][1] - prices[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0] + prices[i]);
}
return dp[len-1][1];
}
// 动态规划 + 状态转移 时间复杂度:O(n) 空间复杂度:O(1)
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(2,vector<int>(2));
dp[0][0] -= prices[0];
dp[0][1] = 0;
for(int i = 1;i < len; i++) {
dp[i % 2][0] = max(dp[(i-1) % 2][0],dp[(i-1) % 2][1] - prices[i]);
dp[i % 2][1] = max(dp[(i-1) % 2][1],dp[(i-1) % 2][0] + prices[i]);
}
return dp[(len-1) % 2][1];
}
};
この質問の動的計画法については、以前の記事で詳しく説明しています: leetCode 122. 株の売買に最適な時期 II 動的計画法 + 状態転送 + 状態圧縮_へへだ( ̄▽ ̄)」のブログ-CSDNブログ https:// blog .csdn.net/weixin_41987016/article/details/133432053?spm=1001.2014.3001.5501
参考およびお勧めの記事とビデオ:
貪欲なアルゴリズムでも在庫問題を解決できます。LeetCode: 122. 株を売買するのに最適な時期 II_bilibili_bilibili
コードランダムレコード (programmercarl.com)
Code Caprice のクラスのスクリーンショット: