天天看點

Leetcode 122 買賣股票最佳時機II

Leetcode 122 買賣股票最佳時機II

給定一個數組 prices ,其中 prices[i] 是一支給定股票第 i 天的價格。

設計一個算法來計算你所能擷取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

示例 1:

輸入: prices = [7,1,5,3,6,4]

輸出: 7

解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。

随後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。

示例 2:

輸入: prices = [1,2,3,4,5]

輸出: 4

解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。

注意你不能在第 1 天和第 2 天接連購買股票,之後再将它們賣出。因為這樣屬于同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。

思考過程

本題與題121的差別在于可以多次買賣股票,第一直覺是貪心做法,既然可以多次買賣,隻要後一天價格比前一天價格高我就買賣一次;

動态規劃思路

①設定dp[i] [0]表示第i天持有股票所獲得的最大收益,dp[i] [1]表示第i天不持有股票所獲得的最大收益

②dp[i] [0]來源可以是第i-1天持有股票dp[i-1] [0],可以是第i天剛剛買入(可以是剛買,也可以是第i-1天賣出第i天買入)dp[i-1] [1]-prices[i];

dp[i] [1]來源可以是第i-1天不持有股票dp[i-1] [1],可以是第i天不持有,第i-1天持有股票dp[i-1] [0]+prices[i];

貪心實作

int maxProfit(vector<int>& prices) {
        int len=prices.size();
        int sum=0;
        for(int i=1;i<len;++i){
            if((prices[i]-prices[i-1])>0) sum+=(prices[i]-prices[i-1]);
        }
        return sum;
    }
           

動規實作

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];
 }