股票价格的最大利润
Posted
技术标签:
【中文标题】股票价格的最大利润【英文标题】:Max Profits of Stock Prices 【发布时间】:2016-08-29 03:14:19 【问题描述】:我正在尝试用 O(nlogn) 时间找出一个分而治之的算法来解决以下现实世界问题 -
假设我们有一组股票价格。想出一个算法,打印出一个数组,该数组中每天 i 的利润最大。
例如,如果我们有数组 A = [4,6,2,1],我们的天数将代表每个索引,我们的输出将是一个值为 [2,-4,-1,-1 ],最后一天的值为 -A[i]。
我想出了一个蛮力算法 -
1.) Scans the array for max after A[i]
2.) Subtracts A[i] with max, places value in A', iterates to next day
3.) When max reaches itself, repeat steps 1 & 2
4.) When you reach the end, the value is -A[i], return
另外,如果上述算法的时间复杂度是 o(n) 或 o(n^2),我会感到困惑。算法中最大的成本是找到最大值,其他的都是 o(1)。
有人可以帮帮我吗?谢谢
【问题讨论】:
您可以在线性时间内完成此操作。尝试在一次反向遍历数组中获取您需要的所有信息。 我不明白,从头开始,并不断减去值以找到每个特定日期的每个最大利润? 【参考方案1】:您不想在这里分而治之。您可以在线性时间 (O(n)) 内完成此操作。这是java中的代码,但你可以用任何语言来做:
int[] maxProfit = new int[prices.length];
int maxPrice = 0;
for (int i = prices.length - 1; i >= 0; i--)
maxProfit[i] = maxPrice - prices[i];
maxPrice = Math.max(maxPrice, prices[i]);
假设您有一个数组prices
,其中包含您的整数价格。
这里的关键是,你可以从头到尾得到你需要的所有信息。
【讨论】:
啊,我明白了。由于它是通过数组的单次传递,因此时间复杂度将是一个简单的 o(n)。但是,我仍在分析这个简单问题的不同时间复杂度,并且迷失在 o(logn) 上。我知道它不如这个算法有效。但是,我很困惑如何在对数组进行分区并将其插入数组的每种不同情况下找到最好的, @tarfar 分而治之的解决方案在这里效果不佳。事实是,对于每个元素,我们必须查看它之后的每个元素。因此,即使我们以某种方式“划分”数组,我们仍然需要查看其他划分来确定我们的结果。 是的,我明白,我只是好奇它是如何工作的。 O(n) 算法非常快,但是,我正在分析分而治之的算法,并将它们应用于不同的问题,以尝试更好地理解这个概念。那么当我们划分每一半时,我们必须将它与另一半进行比较?【参考方案2】:这可以在一次线性扫描中完成,因此复杂度为O(n)
。首先让我们创建最大值数组M
即M[i]
包含我们在i
-th 天之后拥有的最大值。
通过反向线性扫描很容易做到:
我们有A = [4,6,2,1]
,所以第一步我们取A
的最后一个元素,它是1,它是目前的最大值,所以M[3] = 1
,然后我们得到M[2] = max(M[3],A[2]) = 2
,然后我们得到M[1] = max(M[2],A[1]) = 6
,最后在最后一步我们得到M[0] = max(M[1], A[0]) = 6
。
我们将拥有M = [6,6,2,1]
。该算法具有O(n)
复杂度,然后我们将再运行一个循环来确定每天的最大利润,它也具有O(n)
复杂度。顺便说一句,我们可以省略存储M
的值,而不是存储整个数组以仅在i
-th 天之后存储最大值。
【讨论】:
谢谢你的回答,但是M不应该是[2,-4,-1,-1]吗?我试图在数组中找到每天卖出的最大利润 @tarfar 抱歉混淆,M[i] 是一个最大值(A[i], A[i+1],...,A[A.length-1])。最大利润 P 将等于 P[i] = M[i+1]-A[i] 在这种情况下 P=[6-4, 2-6, 1-2, 0-1] = [2, - 4, -1 ,-1]. 没问题,我一时糊涂了。您对如何将其转换为 o(nlogn) 有什么想法吗?我知道我们可以将数组分成三个不同的部分,递归地查看 L、R 以及它们两者。 另外,归纳证明是证明时间复杂度的最佳方法吗? 哇,你帮了大忙!太感谢了!在您的帮助下,我绝对能更好地理解这一点。以上是关于股票价格的最大利润的主要内容,如果未能解决你的问题,请参考以下文章