题目
题号 | 题解 |
---|---|
121. 买卖股票的最佳时机 | 一次遍历 |
122. 买卖股票的最佳时机 II | 动态规划+贪心算法 |
123. 买卖股票的最佳时机 III | 动态规划 |
188. 买卖股票的最佳时机 IV | 动态规划 |
309. 最佳买卖股票时机含冷冻期 | 动态规划 |
714. 买卖股票的最佳时机含手续费 | 动态规划+贪心算法 |
剑指 Offer 63. 股票的最大利润 | 与 121 题相同 |
解题:动态规划
这题因为有冷冻期,所以如果在同一天买入再卖出,后一天便无法买入股票。
// javascript
var maxProfit = function(prices) {
const len = prices.length;
if (len === 0) return 0;
const f = new Array(len).fill().map(() => new Array(3));
f[0][0] = -prices[0];
f[0][1] = 0;
f[0][2] = 0;
for (let i = 1; i < len; i++) {
f[i][0] = Math.max(f[i - 1][0], f[i - 1][2] - prices[i]);
f[i][1] = f[i - 1][0] + prices[i];
f[i][2] = Math.max(f[i - 1][1], f[i - 1][2]);
}
return Math.max(f[len - 1][1], f[len - 1][2]);
};
空间优化的代码:
// javascript
var maxProfit = function(prices) {
const len = prices.length;
if (len === 0) return 0;
// f[i][0]: 持有一支股票,对应的「累计最大收益」
// f[i][1]: 不持有任何股票,并且处于冷冻期中,对应的「累计最大收益」
// f[i][2]: 不持有任何股票,并且不处于冷冻期中,对应的「累计最大收益」
let f0 = -prices[0], f1 = 0, f2 = 0;
for (let i = 1; i < len; i++) {
let newf0 = Math.max(f0, f2 - prices[i]);
let newf1 = f0 + prices[i];
let newf2 = Math.max(f1, f2);
f0 = newf0;
f1 = newf1;
f2 = newf2;
}
return Math.max(f1, f2);
};