[python]leetcode(309). Best Time to Buy and Sell Stock with Cooldown

原创 2017年10月06日 21:52:44

problem

Say you have an array for which the ith element is the price of a
given stock on day i.

Design an algorithm to find the maximum profit. You may complete as
many transactions as you like (ie, buy one and sell one share of the
stock multiple times) with the following restrictions:

You may not engage in multiple transactions at the same time (ie, you
must sell the stock before you buy again). After you sell your stock,
you cannot buy stock on next day. (ie, cooldown 1 day)

Example:

prices = [1, 2, 3, 0, 2]
maxProfit = 3
transactions = [buy, sell, cooldown, buy, sell]

solution1

这种序列优化问题通常使用动态规划的解法,这里特殊的地方在于它有三种状态,而一般的序列优化问题只有两种,例如最长递增子序列问题中,每一个元素又有被选择和未被选择两种,所以这个问题的递推过程要稍微复杂一些。

我的解法如下:

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """

        def helper(prices, start, dp):
            if len(prices) < 2:
                return 0
            ans = 0
            for i in range(start, len(prices)):
                for j in range(i + 1, len(prices)):
                    if dp[j+2] != -1:
                        ans = max(ans, prices[j] - prices[i] + dp[j+2])
                    else:
                        ans = max(ans, prices[j] - prices[i] + helper(prices, j+2, dp))
            dp[start] = ans

            return ans

        dp = [-1] * (len(prices)+2)
        return helper(prices, 0, dp)

这个解法的思想就是把原来起始为0的序列转化为prices[i]买入,prices[j]卖出,加上j+2起始的序列最大值。这样我们就可以写出递推方程了。

这样的时间复杂度为O(n3)

solution2

对于这种多状态问题可以使用多个数组来记录不同的状态为结尾的最优值。

令sell[i] 表示第i天未持股时,获得的最大利润,buy[i]表示第i天持有股票时,获得的最大利润。

这样就可以进行递推了,
buy[i] = max(sell[i-2] - price, buy[i-1])
sell[i] = max(buy[i-1] + price, sell[i-1])

这样的时间复杂度为O(n),同时由于递推过程最多只用到前两天的数据,所以时间复杂度为O(1)

总结

虽然都是动态规划,但是选择好变量表示状态,然后找出递推方程很重要。

对于多状态的问题可以分状态表示多个相互递推的方程组。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】

【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Say you have a...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月14日 06:16
  • 6358

Best Time to Buy and Sell Stock II 最佳时间买入卖出股票(多次买卖)@LeetCode

package Level3; /** * Best Time to Buy and Sell Stock II * * Say you have an array for which t...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月07日 12:34
  • 9772

Best Time to Buy and Sell Stock 最佳时间买入卖出股票(一次买入卖出) @LeetCode

package Level2; /** * Best Time to Buy and Sell Stock * * Say you have an array for which the ...
  • hellobinfeng
  • hellobinfeng
  • 2013年10月19日 00:29
  • 1977

Best Time to Buy and Sell Stock III 最佳时间买入卖出股票(最多两次买卖)@LeetCode

直到要用DP做,但是一开始思路是错的。后来参考了 http://blog.csdn.net/pickless/article/details/12034365 才意识到可以在整个区间的每一点切开,然后...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月08日 00:34
  • 20482

Best Time to Buy and Sell Stock III 两次买卖股票的最佳时机 (重重重)

题目: 只能买卖两次,er
  • skyoceanlover
  • skyoceanlover
  • 2014年08月21日 16:51
  • 782

【Leetcode】Stock Buy and Sell 系列问题 终极分析!

股票系列一共五个变种,这里先分析其中的三个。 第一个:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/?tab=Descri...
  • u010900754
  • u010900754
  • 2017年02月20日 04:27
  • 247

动态规划的经典问题初探: Best Time to Buy and Sell Stock(DP)

1.DescriptionSay you have an array for which the ith element is the price of a given stock on day i....
  • w_bu_neng_ku
  • w_bu_neng_ku
  • 2017年10月26日 01:33
  • 54

Best Time to Buy and Sell Stock III(最多出手两次的多大获利)

出现的bugs: (1)由两个if的来计算序列的值,讨论了>和 (2)引用初始化。在两个函数里的两个参数引用初始化了同一个vector,结果是第二个引用参数由于iterator的更改而全部失效,也...
  • ylzintsinghua
  • ylzintsinghua
  • 2014年12月13日 16:14
  • 302

leetcode刷题,总结,记录,备忘 309

leetcode309 Best Time to Buy and Sell Stock with Cooldown Say you have an array for which the i...
  • guicaisa
  • guicaisa
  • 2015年12月16日 21:01
  • 500

Python 学习 (Leetcode 算法题解【easy部分 技巧总结】)

使用python进行算法题目的练习,对python有了一个基本的了解,在此把这段时间以来学习到的在算法和编程方面的一点经验和技巧记录在此。在日后逐步深入学习的过程中,在慢慢对此进行丰富。如果可能,在完...
  • Hans__Yang
  • Hans__Yang
  • 2016年08月17日 19:30
  • 799
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[python]leetcode(309). Best Time to Buy and Sell Stock with Cooldown
举报原因:
原因补充:

(最多只允许输入30个字)