我试图找出一个用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)。
有人可以帮帮我吗?感谢
答案 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
天之后仅存储最大值。