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