法1:动态规划
想法:
- 参见 JavaScript|LeetCode|动态规划|123. 买卖股票的最佳时机 III 的优化部分
- 该题中,规定了最多交易次数 k
- 用数组 buy 和 sell 来表示第 1 ~ k 次 买入 和 卖出 的最大收益
- prices的长度对于交易次数有限制,故更新k的值: k = Math.min(k, prices.length / 2 向上取整)
- 修改(尽可能缩小) k 的值,有利于节省内存、缩短运行时间
/**
* @param {number} k
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(k, prices) {
if(prices.length == 0) {
return 0;
}
var buy = [], sell = [], N = prices.length, i = 0, j = 0;
k = Math.min(k, Math.ceil(N / 2)); // 尽可能缩小 k 的值
for(i = 0; i <= k; i++) { // 第 1 ~ k 次买入卖出
buy[i] = -prices[0];
sell[i] = 0;
}
for(i = 1; i < N; i++) { // 在第 i 天
for(j = k; j >= 1; j--) { // 更新sell和buy
if(sell[j] < buy[j] + prices[i]) { // 第 j 次卖出
sell[j] = buy[j] + prices[i];
}
if(buy[j] < sell[j - 1] - prices[i]) { // 第 j 次买入
buy[j] = sell[j - 1] - prices[i];
}
}
}
return sell[k];
};