目录
121. 买卖股票的最佳时机
122.买卖股票的最佳时机II
121. 买卖股票的最佳时机
题目链接:121. 买卖股票的最佳时机
比较好想到的是贪心算法,贪心选择价格更低的日子买入,价格更高的日子卖出。
class Solution {
public:int maxProfit(vector<int>& prices) {int low = INT_MAX;int result = 0;for(int i = 0; i < prices.size(); ++i){low = min(low, prices[i]);result = max(result, prices[i] - low);}return result;}
};
动态规划算法不太好想到:
(1)dp[ i ][ 0 ] 表示第 i 天持有股票时,手上的最大金额;
dp[ i ][ 1 ] 表示第 i 天不持有股票时,手上的最大金额;
初始手上金额为 0,持有股票说明当前已经买入了股票,则手上金额为负;
(2)dp[ i ][ 0 ] = max( dp[ i - 1][ 0 ], -prices[ i ] );
dp[ i ][ 1 ] = max( dp[ i - 1 ][ 1 ], dp[ i - 1 ][ 0 ] + prices[ i ] );
(3)dp[ 0 ][ 0 ] = -prices[ i ]; dp[ 0 ][ 1 ] = 0;
(4)按天遍历;
class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(2, vector<int>(2, 0));// dp[i][0]表示第i天持有股票时,手中的最大金额;// dp[i][1]表示第i天不持股票时,手中的最大金额;dp[0][0] = -prices[0];for(int i = 1; i < prices.size(); ++i){dp[i % 2][0] = max(dp[(i-1) % 2][0], -prices[i]);dp[i % 2][1] = max(dp[(i-1) % 2][1], dp[(i-1) % 2][0] + prices[i]);}return dp[(prices.size() - 1) % 2][1];}
};
122.买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II
贪心算法之前做过了;本题的动态规划方法就比较传统:
(1)dp[ i ] 表示前 i 天能得到的最大利润;
(2)dp[ i ] = max( dp[ i - 1], dp[ i - 1 ] + prices[ i ] - prices[ i - 1 ] );
(3)dp[ 0 ] = 0;
(4)按天遍历;
class Solution {
public:int maxProfit(vector<int>& prices) {vector<int> dp(prices.size(), 0);dp[0] = 0;for(int i = 1; i < prices.size(); ++i){dp[i] = max(dp[i - 1], dp[i - 1] + prices[i] - prices[i - 1]);}return dp[prices.size() - 1];}
};