我有以下代码,这是对这个问题的回答:https://leetcode.com/problems/add-digits/
class Solution {
public:
int addDigits(int num) {
if (!num/10)
return num;
long d = 1;
int retVal = 0;
while(num / d){
d *= 10;
}
for(d; d >= 1; d/=10){
retVal += num / d;
num %= d;
}
if (retVal > 9)
retVal = addDigits(retVal);
return retVal;
}
};
作为对此的后续行动,我正在尝试确定BigO的增长情况。我计算它的第一次尝试是O(n^n)
(我假设每个深度的增长直接取决于n
每次),这只是令人沮丧。我错了吗?我希望我错了。
答案 0 :(得分:2)
在这种情况下,它是线性O(n)
,因为你在没有任何循环的情况下递归调用addDigits
方法,并且在方法体中没有一次
更多细节: Determining complexity for recursive functions (Big O notation)
<强>更新强>: 从递归函数被调用一次的观点来看,它是线性的。但是,在这种情况下,它并不完全正确,因为执行次数几乎不依赖于输入参数。
答案 1 :(得分:2)
让n
为num
的基数10中的位数。
我说那个
T(1)= O(1)
T(n)= n + T(n&#39;),n&#39; &LT; = N
这给了我们
O(N * N)
但我们可以做得更好吗?
请注意,2位数字可表示的最大数量为99
,以这种方式减少99
- &gt; 18
- &gt; 9
。
请注意,我们始终可以将10位数字折叠为2 9999999999->90
。对于n>10
,我们可以分解最多10位数的n/10
段中的数字,并将每个2位数的段数减少以进行求和。 n/10
个2位数的总和将始终小于(或等于)(n/10)*2
个数字。因此
T(n)= n + T(n / 5),n> = 10
n&lt; 10的其他基本情况应该更容易。这给了
对于n <10,T(n)= O(1)T(n)= n + T(n / 5),n> = 10
求解递推方程给出
O(n)对于n> = 10
答案 2 :(得分:1)
对于值{&lt; {1}}看起来像O(1)
10,O(n)
用于任何其他值。
我对Big-O符号不够精通,无法回答如何将其结合起来。
最有可能的第一部分在重要性上是可识别的,总体时间复杂度变为O(n)
。