查看: 2417| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[动态规划] 123. Best Time to Buy and Sell Stock III 这题解法中的问题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
https://leetcode.com/problems/be ... and-sell-stock-iii/
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        buy1,buy2 = -sys.maxsize,-sys.maxsize
        profit1,profit2 = 0,0
        for price in prices:
            buy1 = max(buy1, -price)
            profit1 = max(profit1, buy1 + price)
            buy2 = max(buy2, profit1 - price)
            profit2 = max(profit2, buy2 + price)
        return profit2

其他解我都明白了。
但是请问以上这个解法,是如何防止multiple transactions发生的?

上一篇:什么level的公司会考leetcode 315/327/493 这种难度的题?
下一篇:LC205 Isomorphic Strings最新follow up求解
🔗
magicsets 2019-6-29 13:32:31 | 只看该作者
全局:
这个问题可以用两种方式来回答,一种是建立数量关系之后推公式,第二种是从状态转移方程的角度定义循环不变式(loop invariants)

第一种方法比较有意思,这里先写一下

首先不妨设prices有n个元素,那么for循环就会循环n次,我们从0开始编号到n-1,记第k次循环结束时各个变量的值分别为 buy1[k]、profit1[k]、buy2[k]、profit2[k]

由代码易知有如下数量关系:
  1. (1) buy1[k] = max{ - prices[i] | 对于所有的 0 <= i <= k }

  2. (2) profit1[k] = max{ buy1[i] + prices[i] | 对于所有的 0 <= i <= k }

  3. (3) buy2[k] = max{ profit1[i] - prices[i] | 对于所有的 0 <= i <= k }

  4. (4) profit2[k] = max{ buy2[i] + prices[i] | 对于所有的 0 <= i <= k }
复制代码


给定上面的等式,我们可以证明如下定理:
  1. 定理1:profit2[k] = max { prices[j] - prices[i] + prices[v] - prices[u] | 对于所有的 0 <= i <= j <= u <= v <= k }
复制代码


然后由定理1立刻可以得到:
  1. 推论2: profit2[n-1](也就是最后一次循环后profit2的值)即是原问题的解
复制代码


下面来证明定理1,过程其实很直接,首先对(2)式进行展开:
  1. profit1[k] = max{ buy1[i] + prices[i] | 对于所有的 0 <= i <= k }

  2.            = max{ max{ - prices[i] | 对于所有的 0 <= i <= j }
  3.                   + prices[j] | 对于所有的 0 <= j <= k }
  4.                   
  5.            = max{ prices[i] - prices[j] | 对于所有的 0 <= j <= i <= k }
复制代码


然后在此基础上依次对(3)、(4)式展开即可
回复

使用道具 举报

🔗
JoeBlack220 2019-6-29 13:58:21 | 只看该作者
全局:
https://leetcode.com/problems/be ... s-of-stock-problems
这个帖子用的和楼主发的解答应该是同一种做法,可以看看
回复

使用道具 举报

🔗
wisdompeak2 2019-6-30 02:35:33 | 只看该作者
全局:
表达式已经很明显地做了规则的约定。
比如说: buy2 = max(buy2, profit1 - price)
表明buy2只能是由卖掉一只股票之后再买入一只股票得到(profit1 - price)。这个表达式没有允许通过买入一只股票再买入一只股票来实现buy2(那样的话就是buy1-price)、
回复

使用道具 举报

🔗
 楼主| whodatj 2019-7-2 00:47:24 | 只看该作者
全局:
谢谢楼上各位。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表