【发布时间】:2018-12-02 20:09:46
【问题描述】:
我正在做一个我无法解决的练习。我需要通过买卖比特币来获得最大的累积利润。我有一个函数(A,Y),它在一段时间内接收一个 A = 不同价格的数组,一个 Y = 费用 限制:
注意:如果比特币以 0 买入并以 1 卖出,我们将损失 A[1] - A[0] =7050 -7200 - Y = -200。所以,这个动作没有做出来。
注意2:您当时只能拥有1个比特币。要出售,您必须先购买。要购买,您需要什么都没有或之前出售过。
注意3:运动必须是时间的结果。你不能在 A[5] 买入并在 A[4] 卖出
注4:如果不能盈利,则返回0
复杂度为 O(N)
A = [7200,7050,7300,7500,7440,7200,7300,7280,7400] //expected result 550
Y = 50
A[3] - A[1] - Y = 7500 - 7050 - 50 = 400
A[8] - A[5] - Y = 7400 - 7200 - 50 = 150
result = 550 //maximum accumulated profit
这就是我所拥有的
function solution(A, Y) {
if(A.length < 2) {
return 0;
}
var minIndex = (A[0] > A[1]) ? 1 : 0;
var minPrice = A[minIndex];
var acum = 0;
var i = minIndex + 1
for (i; i< A.length-1; i++) {
if( (A[i] - minPrice - Y) > (A[i+1] - minPrice - Y )) {
acum += A[i] - minPrice - Y;
i = i+1
} else {
acum += A[i + 1] - minPrice - Y;
i = i+2
}
minPrice = (A[i] > A[i+1]) ? A[i+1] : A[i];
}
return acum > 0 ? acum : 0;
}
实际上我得到了 450 但应该是 550
【问题讨论】:
-
有一个错误:如果 i 可能变成 A.length-1,那么 A[i+1] 将是 A[A.length]。好吧,这在 Javascript 中应该是未定义的。
-
你怎么知道局部最大值?
-
@NinaScholz 练习告诉我我应该得到的价值。
-
我认为正确的答案是 Mark_M 的答案。
标签: javascript arrays algorithm