股票最大利润

时间:2016-05-03 21:45:19

标签: arrays algorithm time-complexity brute-force divide-and-conquer

我试图找出一个用O(nlogn)时间来划分和征服算法来解决以下现实问题 -

假设我们有一系列股票价格。想出一个算法,打印出一个数组,其中包含数组中每天的最大利润。

因此,例如,如果我们有数组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)。

有人可以帮帮我吗?感谢

2 个答案:

答案 0 :(得分: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,其中包含您的整数价格。

这里的关键是,您可以从结束开始向后搜索所需的所有信息。

答案 1 :(得分:0)

这可以在一次线性扫描中完成,因此复杂度为O(n)。首先,让我们创建最大数组M,即M[i]包含我们在i天后的最大数量。

通过反向线性扫描很容易做到:

我们有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天之后仅存储最大值。