【代码随想录二刷】Day50-动态规划-Go

代码随想录二刷Day50

今日任务

123.买卖股票的最佳时机III
188.买卖股票的最佳时机IV
语言:Go

123. 买卖股票的最佳时机III

链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/
dp数组可优化为长度为5的数组,空间复杂度为O(1)

func max(i, j int) int {
    if i < j {
        return j
    } else {
        return i
    }
}

func maxProfit(prices []int) int {
    //0:还未进行过交易
    //1:第一笔交易买入
    //2:第一笔交易卖出
    //3:第二笔交易买入
    //4:第二笔交易卖出
    dp := make([][5]int, len(prices))
    dp[0][1] = -prices[0]
    dp[0][3] = -prices[0]
    for i := 1; i < len(prices); i++ {
        dp[i][0] = dp[i - 1][0]
        dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])
        dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
        dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3])
        dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4])
    }
    idx := len(prices) - 1
    return max(dp[idx][0], max(max(dp[idx][1], dp[idx][2]), max(dp[idx][3], dp[idx][4])))
}

188. 买卖股票的最佳时机IV

链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/

func max(i, j int) int {
    if i < j {
        return j
    } else {
        return i
    }
}

func maxProfit(k int, prices []int) int {
    dp := make([]int, k * 2 + 1)
    //偶数:未交易/卖出
    //奇数:买入
    for i := 0; i < k * 2 + 1; i++ {
        if i % 2 == 1 {
            dp[i] = -prices[0]
        }
    }
    for i := 1; i < len(prices); i++ {
        for j := 1; j < k * 2 + 1; j++ {
            if j % 2 == 1 {
                dp[j] = max(dp[j - 1] - prices[i], dp[j])
            } else {
                dp[j] = max(dp[j - 1] + prices[i], dp[j])
            }
        }
    }
    ret := dp[0]
    for i := 0; i < k * 2 + 1; i++ {
        if dp[i] > ret {
            ret = dp[i]
        }
    }
    return ret
}

你可能感兴趣的:(代码随想录训练营二刷,动态规划,leetcode)