一个方法团灭 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.
-
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.
-
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.
-
文章链接点这里:一个方法团灭 LeetCode 股票买卖问题
评论礼仪 见这里,违者直接拉黑。
Beta Was this translation helpful? Give feedback.
All reactions