理解LeetCode 121 买卖股票的最佳时机Ruby解法的逻辑疑问
问题解答
计算错误点
你忽略了value = [0, value].max是每一轮迭代都会紧接在累加操作后立刻执行的,上一轮迭代的value会先被截断为不小于0的值,才会进入下一轮的累加计算,而非带着负数结果进入下一轮。
逐轮运行逻辑拆解
我们以你给出的示例输入prices = [7,1,5,3,6,4]为例,完整走一遍代码流程:
初始值:value = 0,profit = 0,迭代范围是i = 1 到 5(对应数组的第2到第6个元素)
i=1(对应第2天价格1)
- 累加价差:
value += (prices[1] - prices[0])→0 + (1-7) = -6 - 截断非负:
value = [0, -6].max→0 - 更新最大利润:
0不大于当前profit的0,无变化
本轮结束value为0
- 累加价差:
i=2(对应第3天价格5)
- 累加价差:
value += (prices[2] - prices[1])→0 + (5-1) = 4 - 截断非负:
value = [0,4].max→4 - 更新最大利润:
4>0,profit更新为4
本轮结束value为4
- 累加价差:
i=3(对应第4天价格3)
- 累加价差:
value += (prices[3] - prices[2])→4 + (3-5) = 2 - 截断非负:
value = [0,2].max→2 - 更新最大利润:
2<4,无变化
本轮结束value为2
- 累加价差:
i=4(对应第5天价格6)
- 累加价差:
value += (prices[4] - prices[3])→2 + (6-3) =5 - 截断非负:
value = [0,5].max→5 - 更新最大利润:
5>4,profit更新为5
本轮结束value为5
- 累加价差:
i=5(对应第6天价格4)
- 累加价差:
value += (prices[5] - prices[4])→5 + (4-6) =3 - 截断非负:
value = [0,3].max→3 - 更新最大利润:
3<5,无变化
本轮结束value为3
- 累加价差:
最终返回profit为5,和预期结果一致,你打印得到的value序列0、4、2、5、3就是每一轮迭代结束后的value值,完全符合代码运行逻辑。
解法本质补充
这个解法是Kadane算法的变种,核心是将原问题转化为求「相邻价格差组成的数组的最大子数组和」,如果最大子数组和为负则返回0。因为连续的价差累加结果等价于子数组最后一天价格减去第一天价格,也就是你在子数组起始日买入、结束日卖出能获得的利润。
内容的提问来源于stack exchange,提问作者AOS
相关产品推荐
相关产品推荐

