【发布时间】:2017-11-11 17:05:57
【问题描述】:
我很难找出下面代码的最差时间复杂度。
(这不是作业,请参阅https://leetcode.com/problems/integer-replacement/description/。)
int recursion (int n) {
if (n == 1)
return 0;
if (n % 2 == 0) {
return recursion(n/2) + 1
} else {
return min(recursion(n / 2 + 1) + 1, recursion(n - 1)) + 1;
}
}
我唯一知道的是N == 2 ^ k(k > 0),最差的时间复杂度是O(logN)。
但是,我不清楚N 何时不是2^k。因为即使number / 2 仍然可以得到奇数。有人说还是O(LogN),但我不服。
我知道代码不是最好的解决方案,只是想分析一下时间复杂度。我尝试了递归树和聚合分析,似乎没有帮助。
【问题讨论】:
-
你的 else 案例有一个错误的陈述,它应该是
(n+1)/2 -
@BlackMamba 。嗨, (n + 1) 会溢出。但我还有其他错误。已更新。非常感谢
-
我看到了leetcode问题陈述。我确实不看到,在前两个修订版中,您的最后一个分支(带有
min在备选方案之间进行选择的分支)与它相关 - 它不应该是“else”的一部分如果“then”以无条件的return结束,无论如何。 -
它有一个简单实用的解决方案。如果它比 O(logN) 更糟,那么它总是会在 N 的大值上炸毁堆栈。所以用 INT_MAX 运行一次,如果它没有崩溃,那么它就是 QED。在 SO 中这是否是 leet 并不是很重要 :) leet 足够了。