目次
LeeCode 121. 株を売買するのに最適な時期
LeeCode 122. 株を売買するのに最適な時期 II
LeeCode 121. 株を売買するのに最適な時期
5 つの部分に戻ります。
1. dp 配列と添え字の意味を決定します: dp[i][0] は i 日目に株を保有することで得た最も多くの現金を意味します; dp[i][1] は株を保有しないことで得た最も多くの現金を意味しますi 日目の在庫。
2.确定递推公式: dp[i][0] = max(dp[i - 1][0], -prices[i])、dp[i][1] = max(dp[i - 1] [1]、価格[i] + dp[i - 1][0]);
3. dp 配列の初期化方法: dp[0][0] -= 価格[0], dp[0][1] = 0;
4. 走査順序を決定します。前から後ろに走査します。
5. 再帰的 dp 配列の例。
コード:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if (len == 0) return 0;
vector<vector<int>> dp(len, vector<int>(2));
dp[0][0] -= prices[0];
dp[0][1] = 0;
for (int i = 1; i < len; i++) {
dp[i][0] = max(dp[i - 1][0], -prices[i]);
dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
}
return dp[len - 1][1];
}
};
時間計算量: O(n) 空間計算量: O(n)
改善: スクロール配列でスペースを節約し、当日の dp 状態と前日の dp 状態のみを記録します。
class Solution {
public:
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], -prices[i]);
dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);
}
return dp[(len - 1) % 2][1];
}
};
時間計算量: O(n) 空間計算量: O(1)
LeeCode 122. 株を売買するのに最適な時期 II
122. 株を売買するのに最適な時期 II - LeetCode
アイデア:
この質問と LeeCode 121 の違いは、株を売買するのに最適な時期は、株は複数回売買できるため、i 日目に株を買うと、保有している現金に利益が出る可能性があることです。以前の取引から。
5 つの部分に戻ります。
1. dp 配列と添え字の意味を決定します: dp[i][0] は i 日目に株を保有することで得た最も多くの現金を意味します; dp[i][1] は株を保有しないことで得た最も多くの現金を意味しますi 日目の在庫。
2.确定递推公式: dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - 価格[i])、dp[i][1] = max(dp[i - 1][1], 価格[i] + dp[i - 1][0]);
3. dp 配列の初期化方法: dp[0][0] -= 価格[0], dp[0][1] = 0;
4. 走査順序を決定します。前から後ろに走査します。
5. 再帰的 dp 配列の例。
コード:
class Solution {
public:
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(n)
改善: スクロール配列でスペースを節約し、当日の dp 状態と前日の dp 状態のみを記録します。
class Solution {
public:
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];
}
};
時間計算量: O(n) 空間計算量: O(1)