- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解我为以下 leetCode 问题找到的解决方案。
描述:
“您将获得一系列价格,其中价格 [i] 是给定股票在第 i 天的价格。
您希望通过选择某一天购买一只股票并选择 future 的另一天出售该股票来最大化您的利润。
返回您可以从这次交易中获得的最大利润。如果您无法获得任何利润,则返回 0。”
解释:
"输入:价格 = [7,1,5,3,6,4]
输出:5
解释:在第 2 天买入(价格 = 1)并在第 5 天卖出(价格 = 6),利润 = 6-1 = 5。
请注意,不允许在第 2 天买入并在第 1 天卖出,因为您必须先买入再卖出。”
我遇到了我试图理解的这个解决方案。在“->”处分解:
def max_profit([7,1,5,3,6,4])
value = 0
profit = 0
(1...prices.size).each do |i|
value += (prices[i] - prices[i-1])
-> 所以这里 value = 0 + (1-7 = -6)= -6/value = -6 + (5-1=4)= -2/value = -2+(3-5)=-4 和以-3结尾
value = [0, value].max
-> 这是我不明白的。现在 value = [0, value].max 并且当我打印它时我得到 0,4,2,5,3。
profit = value if value > profit
end
profit
end
一百万谢谢
最佳答案
理解程序的一个好方法是简单地用笔和纸逐步完成它,同时跟踪所有(相关)状态。所以,让我们这样做。
在我们的例子中,相关状态是两个局部变量 profit
的值。和 value
以及迭代变量i
并通过扩展 prices[i]
和 prices[i-1]
.我们首先将它们都初始化为值 0
在方法的第 1 行和第 2 行中。然后,第 4-8 行是执行所有实际工作的循环;第 10 行简单地返回结果。很容易看出第 5-7 行是做所有工作的,所以让我们关注那些:i
线
代码
它有什么作用?profit
value
prices[i]
prices[i-1]
1
5value += (prices[i] - prices[i-1])
将价格差异添加到当前值0
0 -6 = -6
7
1
1
6value = [0, value].max
套装value
最大 0
及其当前值,IOW 集 value
至 0
如果是阴性0
0
7
1
1
7profit = value if value > profit
套装profit
到其当前值的最大值和 value
0
0
7
1
2
5value += (prices[i] - prices[i-1])
将价格差异添加到当前值0
0 + 4 = 4
1
5
2
6value = [0, value].max
套装value
最大 0
及其当前值,IOW 集 value
至 0
如果是阴性0
4
1
5
2
7profit = value if value > profit
套装profit
到其当前值的最大值和 value
4
4
1
5
3
5value += (prices[i] - prices[i-1])
将价格差异添加到当前值4
4 - 2 = 2
5
3
3
6value = [0, value].max
套装value
最大 0
及其当前值,IOW 集 value
至 0
如果是阴性4
2
5
3
3
7profit = value if value > profit
套装profit
到其当前值的最大值和 value
4
4
5
3
4
5value += (prices[i] - prices[i-1])
将价格差异添加到当前值4
2 + 3 = 5
3
6
4
6value = [0, value].max
套装value
最大 0
及其当前值,IOW 集 value
至 0
如果是阴性4
5
3
6
4
7profit = value if value > profit
套装profit
到其当前值的最大值和 value
5
5
3
6
5
5value += (prices[i] - prices[i-1])
将价格差异添加到当前值5
5 - 2 = 3
6
4
5
6value = [0, value].max
套装value
最大 0
及其当前值,IOW 集 value
至 0
如果是阴性5
3
6
4
5
7profit = value if value > profit
套装profit
到其当前值的最大值和 value
5
3
6
4
What actually happens when I do value = [0, value].max. ?
Enumerable#max
但是
Array#max
,但在本例中它们的行为相同]:
Returns the object in enum with the maximum value.
Enumerable
的最大值。 .
max
没有意义。在第 6 行和
if
在第 7 行做同样的事情:坚持一个或另一个,不要用两种不同的东西做同样的事情来混淆读者。此外,在 Ruby 中几乎从未对集合进行手动迭代。使用
Enumerable#each_cons
可以更好地表达这一点。和例如
Enumerable#max_by
或
Enumerable#reduce
.实际上,完美的解决方案是使用
prefix sum aka scan ,但不幸的是,这在 Ruby 的核心和标准库中是不可用的。
def max_profit(prices)
prices.
each_cons(2).
reduce([0, 0]) do |(value, profit), (a, b)|
[[temp = value + b - a, 0].max, [temp, profit].max]
do.
last
end
或这个:
def max_profit(prices)
prices.
each_cons(2).
map {|a, b| b - a }.
reduce([]) do |res, difference|
res << [(res[-1] || 0) + difference, 0].max
end.
max
end
关于ruby - 理解 leetCode - 121. 买卖股票的最佳时机 - Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68604541/
我是一名优秀的程序员,十分优秀!