【发布时间】:2020-04-20 04:31:32
【问题描述】:
我最近正在研究我在 LeetCode 上发现的一个问题的解决方案。问题可以在这里看到: https://leetcode.com/articles/best-time-to-buy-and-sell-stock-ii/#
关于蛮力方法文章详情,我不明白为什么时间复杂度是O(n^n)。我相信它应该是 O(n!)。我也不明白为什么空间复杂度是 O(N),因为似乎没有存储数组。
这是该问题的蛮力解决方案的代码:
class Solution {
public int maxProfit(int[] prices) {
return calculate(prices, 0);
}
public int calculate(int prices[], int s) {
if (s >= prices.length)
return 0;
int max = 0;
for (int start = s; start < prices.length; start++) {
int maxprofit = 0;
for (int i = start + 1; i < prices.length; i++) {
if (prices[start] < prices[i]) {
int profit = calculate(prices, i + 1) + prices[i] - prices[start];
if (profit > maxprofit)
maxprofit = profit;
}
}
if (maxprofit > max)
max = maxprofit;
}
return max;
}
}
【问题讨论】:
-
“我认为应该是 O(n!)”,你能解释一下你为什么这么认为吗?
-
@akuzminykh 外循环是 n,内循环是 n-1。然后外循环变成n-1,内循环变成n-2。以此类推
-
@D-Studios 你注意到递归调用了吗,这就是它成指数的原因
-
@D-Studios 对于这种情况,形式上正确的证明有点困难,你必须写很多东西。但相信我,这是O(n^n)。如果/当我有时间时,我会在这里发布证明。
-
@akuzminykh 我的empirical evidence 另有说明,即 O(2^n),而不是 O(n^n)。
标签: java time-complexity brute-force stock space-complexity