Leekow-309 株式の売買に最適な時期には凍結期間が含まれる
1. トピック
309. 株式の売買に最適な時期には凍結期間が含まれる
整数の配列を指定するprices
と、 thprices[i]
はi
th 日目の株価を表します。
最大利益を計算するアルゴリズムを設計します。次の制約に従って、できるだけ多くのトランザクション (株式の売買を複数回行う) を完了できます。
- 株を売却した翌日には株を買うことはできません(凍結期間は1日です)。
注: 同時に複数の取引に参加することはできません (再度購入する前に、前の株式を売却する必要があります)。
例 1:
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
2. 分析
- トピック。この質問と 122 株の売買に最適な時期 II の唯一の違いは、追加の凍結期間があることです。複数回売買することは可能ですが、購入には売却から1日かかり、最大で1株しか保有できません。
- dpを導き出します。同様に、毎日には買いの状態と売りの状態という 2 つの状態があり、どちらも前日に関連していますが、売った後に買い続けるには次の日がかかり、dp 配列を推定すると、それぞれの i が導出されます。したがって、購入時にこの凍結期間を直接 2 日早めることができます。
- トラバース。表から裏への縦走には前日が必要です。
3. コードとコメント
class Solution {
public int maxProfit(int[] prices) {
// 1. 两个状态,买入,卖出
int n = prices.length;
int[][] dp = new int[n][2];
if (n == 0 || n == 1) return 0;
// 2. 由于后面买入的时候需要跨一个冷冻期,i-2,所以前面两天的我们都需要初始化
dp[0][1] = -prices[0];
dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
dp[1][1] = Math.max(dp[0][1], dp[0][0] - prices[1]);
// 3. dp是每个i值都推导,所以我们在买入的时候只需往前计算前2天的即可
for (int i = 2; i < n; i++){
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 2][0] - prices[i]);
}
return dp[n - 1][0];
}
}
4. 練習する
トピックへのリンク: 309. 株式の売買に最適な時期には凍結期間が含まれます