【发布时间】:2015-09-21 23:28:25
【问题描述】:
编辑:
我感谢你们俩的帮助,但我必须遵守 O(n log n) 时间完整性的界限,并且必须使用二进制递归的分而治之技术。我在最初的帖子中没有说得很清楚
我有一个未排序的整数数组,我必须在第 i 天买入股票并在第 j 天卖出以获得最大利润,其中第 i 天(较小的值)必须在第 j 天(较大的值) 日。到目前为止,我找到了一个解决方案,可以返回购买和销售天数(数组的索引值)和最大利润,但它的时间复杂度为 O(n^2),我很难达到 O(n log n) 时间复杂度和实现分而治之
public static Profit BestProfit( int[] a, int i, int j )
{
Profit bestProfit = new Profit();
int n = j;
int maxProfit = 0;
for(i = 0; i < n; i++)
{
for(j = i; j < n; j++)
{
if(a[j] - a[i] > maxProfit)
{
maxProfit = a[j] - a[i];
bestProfit.setBuy( i );
bestProfit.setSell( j );
bestProfit.setMaxProfit( maxProfit );
}
}
return bestProfit;
}
参数 i 是数组的开头, j 是数组的末尾 Profit 类是我创建的用于保存买入、卖出和利润值的类。
我发现我需要考虑的三种情况是数组前半部分的利润最大,数组后半部分的利润最大,最小值在前半部分的情况数组的最大值和最大值在数组的第二半(我已经用一个简单的 min/max 函数完成了这部分问题,解决了最后的情况)。
我被困住了,任何有关分而治之实施或技巧提示的帮助将不胜感激!
【问题讨论】:
-
我编辑了聚合分而治之的解决方案。