一个方法团灭 LeetCode 股票买卖问题 :: labuladong的算法小抄 #1012
Replies: 144 comments 46 replies
-
感谢分享,思路很清晰,公式很强大! |
Beta Was this translation helpful? Give feedback.
-
-prices[i]怎么理解呢 |
Beta Was this translation helpful? Give feedback.
-
-prices[i] 我理解,第一天你如果持有,那么你就是第一天买入了股票,此时你的利润就是 - prices[i] |
Beta Was this translation helpful? Give feedback.
-
-prices[I]只出现在k = 1的情况。因为如果只有一次交易的话,那每天的dp[i][1]状态(第i天手持股票)只会是因为我在当天购买了股票,使得我目前的资本为-prices[I],所以是负数。 |
Beta Was this translation helpful? Give feedback.
-
文中的“而且注意 k 的限制,我们在选择 buy 的时候,把 k 减小了 1,很好理解吧,当然你也可以在 sell 的时候减 1,一样的。”这句话应该是只有买入的时候才能够减1吧,卖出的时候不能减1。因为只有买入之后才能够卖出吧?而且我在写188.买卖股票的最佳时机 IV(困难)时候,buy操作减1是能够过题,但是sell操作减1是不能够过样例的。 |
Beta Was this translation helpful? Give feedback.
-
冷冻期的那个题,i-2 越界到-1是怎么处理的呢? 不是太通透? |
Beta Was this translation helpful? Give feedback.
-
@20183501053lxc 你说的有道理,我在文中重新探讨了这个问题 |
Beta Was this translation helpful? Give feedback.
-
@NathanSu0304 我重新修改了一下 |
Beta Was this translation helpful? Give feedback.
-
感谢分享,爆赞 [强] |
Beta Was this translation helpful? Give feedback.
-
非常感谢!整体逻辑非常清晰。但是有一个Base case有点想不通。
这个时候的利润为何不能是最后一笔卖出的利润? |
Beta Was this translation helpful? Give feedback.
-
我有点想明白了。
比起说k=0意味着"根本不允许交易", 对我来说k=0意味着"我不想交易" 更好理解一些。 当然 |
Beta Was this translation helpful? Give feedback.
-
@0xlightyear 很高兴你提出这个问题,不过我觉得你的理解有点偏差。其实很好理解, |
Beta Was this translation helpful? Give feedback.
-
@labuladong 是的是的!无论是从"我希望不超过k次买卖"还是"不允许超过k次买卖",两个角度描述的核心都是"不超过k次"的最值。同一个意思。想了一天终于明白了。非常感谢博主做出这一套教程,思路太棒了! |
Beta Was this translation helpful? Give feedback.
-
@0xlightyear 加油~ |
Beta Was this translation helpful? Give feedback.
-
寫的真的是很好 謝謝! |
Beta Was this translation helpful? Give feedback.
-
对于这个case,我最开始也是很疑惑的,我认为应该是: dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k+1][0] - prices[i]) 因为直觉上认为昨天的交易次数上限肯定是比今天多才行,但是仔细想想这是不可能的。 后面想通了,这个k应该这样来理解: 注意交易的定义:文中定义是我们把一次买入和一次卖出定义为一次「交易」。因为我们必须先买入才可能卖出,所以当进行一次买入操作相当于隐形的包含后面一次卖出,所以在代码实现时,交易次数的减1操作可以认为是买入的时候进行,卖出的时候不影响交易次数。 |
Beta Was this translation helpful? Give feedback.
-
其实我感觉 k还是从0开始循环比较好......毕竟最大交易次数递增的时候,利润是可能增加的 |
Beta Was this translation helpful? Give feedback.
-
关于k的含义,我说说自己的理解。注意这里的k表示的是【最多可以完成的交易次数】
在第二种情况中,这里为什么k-1呢? 因为第二种情况中我确定【今天买了股票】,因此我们需要保证之前几天的交易不会把【最大交易次数k】给用完,不然用完了,今天肯定买不了了,所以在之前的天数里,最多只能有k-1 次最大交易次数,以便在第 i 天(今天)买入股票, |
Beta Was this translation helpful? Give feedback.
-
#121题,为什么按照框架会有错误
|
Beta Was this translation helpful? Give feedback.
-
屌爆了! |
Beta Was this translation helpful? Give feedback.
-
123 // 穷举了 n × max_k × 2 个状态,正确。 |
Beta Was this translation helpful? Give feedback.
-
求教,第三个版本的k=2的股票交易,为什么用for循环的dp可以通过,但是递归+剪枝的dp就要超时呢,感觉复杂度应该是一样的呀
|
Beta Was this translation helpful? Give feedback.
-
疑似勘误: 但为什么我从大到小遍历 k 也可以正确提交呢? 应该是: 但为什么我从小到大遍历 k 也可以正确提交呢? |
Beta Was this translation helpful? Give feedback.
-
谢谢分享 |
Beta Was this translation helpful? Give feedback.
-
121和122的优化空间后的temp似乎可以不需要?我看可以跑过去 |
Beta Was this translation helpful? Give feedback.
-
注意123题,c++的同学不要用la老师给的动态变长数组定义dp,要用vector。否则过不了哈。 |
Beta Was this translation helpful? Give feedback.
-
购买次数限制为K时,下面这块代码没必要写吧,因为dp[i][0][1] 这种情况根本不存在(程序不会用到),dp[i][0][0] 本来就是0 |
Beta Was this translation helpful? Give feedback.
-
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
Beta Was this translation helpful? Give feedback.
-
英文高赞题解没了QAQ |
Beta Was this translation helpful? Give feedback.
-
这里四个状态的顺序有没有影响,我测试了下顺序任意顺序答案都正确 func maxProfit_k_2(prices []int) int {
// 初始化 base case
dp_i10, dp_i11 := 0, math.MinInt64
dp_i20, dp_i21 := 0, math.MinInt64
for _, price := range prices {
dp_i20 = max(dp_i20, dp_i21+price)
dp_i21 = max(dp_i21, dp_i10-price)
dp_i10 = max(dp_i10, dp_i11+price)
dp_i11 = max(dp_i11, -price)
}
return dp_i20
} |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
文章链接点这里:一个方法团灭 LeetCode 股票买卖问题
评论礼仪 见这里,违者直接拉黑。
Beta Was this translation helpful? Give feedback.
All reactions