コードランダム記録アルゴリズム合宿49日目 | 株式問題の話題(1)

目次

LeeCode 121. 株を売買するのに最適な時期

LeeCode 122. 株を売買するのに最適な時期 II


LeeCode 121. 株を売買するのに最適な時期

121. 株を売買するのに最適な時期 - LeetCode

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)

おすすめ

転載: blog.csdn.net/weixin_74976519/article/details/131133964