美文网首页
Leetcode 188. 买卖股票的最佳时机 IV

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

作者: zhipingChen | 来源:发表于2019-06-13 23:48 被阅读0次

    题目描述

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

    注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:

    输入: [2,4,1], k = 2
    输出: 2
    解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

    示例 2:

    输入: [3,2,6,5,0,3], k = 2
    输出: 7
    解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
    随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。

    解法

    参考:Leetcode 123. 买卖股票的最佳时机 III

    因为 j 只有 0 和 1 两种状态,则有如下递推关系式:

    f(i,k,0)=max[f(i-1,k,0),f(i-1,k,1)+prices[i]]
    f(i,k,1)=max[f(i-1,k,1),f(i-1,k-1,0)-prices[i]]

    dp 数组的初始化中,dp[0][1] 无意义,因为这里以买入股票作为开始一次交易,所以不存在 0 次交易,持有股票的情况。

    class Solution:
        def maxProfit(self, k: int, prices: List[int]) -> int:
            if not prices or k<1:
                return 0
            dp=[[0,-prices[0]] for i in range(k+1)]
            for i in range(1,len(prices)):
                for k in range(1,k+1):
                    dp[k][1]=max(dp[k][1],dp[k-1][0]-prices[i])
                    dp[k][0]=max(dp[k][0],dp[k][1]+prices[i])
            return dp[k][0]
    

    因为在该题目的测试用例中,给出的 k 值存在极大数字的情况,考虑到当 k \ge len(prices)//2 时,意味着在该股票价格列表中,可以随意买入和卖出,即相当于不限制次数,所以增加对 k 值的判断。

    class Solution:
        def maxProfit(self, k: int, prices: List[int]) -> int:
            if not prices or k<1:
                return 0
            if k>len(prices)//2:  #相当于不限制交易次数
                i0,i1=0,-prices[0]
                for i in range(1,len(prices)):
                    i0=max(i0,i1+prices[i])
                    i1=max(i1,i0-prices[i])
                return i0
            dp=[[0,-prices[0]] for i in range(k+1)]
            for i in range(1,len(prices)):
                for k in range(1,k+1):
                    dp[k][1]=max(dp[k][1],dp[k-1][0]-prices[i])
                    dp[k][0]=max(dp[k][0],dp[k][1]+prices[i])
            return dp[k][0]
    

    相关文章

      网友评论

          本文标题:Leetcode 188. 买卖股票的最佳时机 IV

          本文链接:https://www.haomeiwen.com/subject/fxryfctx.html