leetcode 188 买卖股票最佳时机四

139 阅读1分钟
/**
 * @param {number} k
 * @param {number[]} prices
 * @return {number}
 * 在同一天可以既卖出又买入、既买入又卖出, 只要不超过k笔交易就行
 */
var maxProfit = function(k, prices) {
    let n = prices.length
    if((k < 1) || prices.length < 2 ) return 0
    if((n / 2 | 0) <= k) return maxProfitNoLimit(prices)
    const dp = new Array(n)
    for(let i = 0; i < n; i++) {
        dp[i] = new Array(k + 1)
        for(let j = 0; j <= k; j++) dp[i][j] = new Array(2).fill(0)
    }
    for(let i = 1; i <= k ;i++) dp[0][i][1] = -prices[0]
    // 0 不持有,1持有
    for(let i = 1; i < n; i++) {
        for(let j = 1; j <= k; j++) {
            // 每一步都取最大的,总体上就是最大
            dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i])
            dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i])
        }
    }
    return dp[n - 1][k][0]
};

function maxProfitNoLimit(prices) {
    let n = prices.length - 1
    let p = 0
    for(let i = 0; i < n ; i++) {
        if((prices[i + 1] - prices[i]) > 0) {
            p += (prices[i + 1] - prices[i])
        }
    }
    return p
}