121. 买卖股票的最佳时机
注意点:
本题是只能卖一次
dp数组初始化的时候 dp[j][0]是j时候不持有的收益, dp[j][1]是j时候持有的收益
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(len, vector<int>(2));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int j = 1; j < len; j++) {
// dp[j][0]是j时候不持有,获得的利润是dp[j][0]
// dp[j][1]是j的时候持有,获得的利润是dp[j][0]
dp[j][0] = max(dp[j-1][0], dp[j-1][1]+prices[j]);
dp[j][1] = max(dp[j-1][1], -prices[j]);
}
// 因为不持有的时候包含收益,dp[len-1][0]一定大于dp[len-1][0]
return dp[len-1][0];
}
};
122. 买卖股票的最佳时机 II
注意点:
1.和121. 买卖股票的最佳时机 非常相似,只不过是递归函数中的一小部分不太相同dp[j][1] = max(dp[j-1][1], dp[j][0]-prices[j]),主要是考虑了可以重复买卖的操作
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(len, vector<int>(2));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int j = 1; j < len; j++) {
// dp[j][0]是j时候不持有,获得的利润是dp[j][0]
// dp[j][1]是j的时候持有,获得的利润是dp[j][0]
dp[j][0] = max(dp[j-1][0], dp[j-1][1]+prices[j]);
dp[j][1] = max(dp[j-1][1], dp[j][0]-prices[j]);
}
// 因为不持有的时候包含收益,dp[len-1][0]一定大于dp[len-1][0]
return dp[len-1][0];
}
};