【发布时间】:2021-01-13 22:52:40
【问题描述】:
最近我在尝试股票买卖问题,我们可以在任何一天买入一只股票并在接下来的任何一天卖出,我们必须找到我们可以获得的最大利润。
我首先想到的解决方案是下面的代码,但我无法确定它的时间复杂度。如果您能提供帮助,那将非常有帮助。
int maxProfit(int price[], int start, int end){
if(end<=start)
return 0;
int profit=0;
for(int i=start; i<end; i++){
for(int j=i+1; j<=end; j++){
if(price[j]>price[i]){
int curr_profit=price[j]-price[i]+maxProfit(price,start,i-1)+maxProfit(price,j+1,end);
profit=max(profit,curr_profit);
}
}
return profit;
}
}
【问题讨论】:
-
循环是 O^2,两个递归调用只会让事情变得更糟。在这一点上,试图弄清楚最终的复杂性是没有意义的。将其描述为“坏”就足够了。
-
只是想知道因为我读了几个小时但找不到与此相关的内容。有人说它是某种二进制递归,但这也无济于事。这段代码的时间复杂度可以用递归树计算吗?
-
我猜它的 n^4。
maxProfit可能需要缓存它已经计算的值。应该把它降低到 n^2 -
这些来自各种在线编码/黑客/竞赛网站的谜题对帮助任何人实现学习 C++ 的目标毫无帮助。这个问题的正确解决方案将是 O(n),并且不需要任何递归。只有三个循环和两个临时向量(元组)来存储中间结果。您不会在上述各种在线编码/黑客/竞赛网站上找到有关用于解决这些难题的计算机算法的信息,而只能在教科书中找到有关此主题的信息。
-
@SamVarshavchik 我知道它可以在线性时间内解决,但是从这段代码中值得学习的是准确确定时间复杂度,我真的没有见过这样的时间问题复杂。这是我问的唯一原因。 (我没有要求最佳解决方案)
标签: c++ algorithm c++11 data-structures time-complexity