Time complexity 如何从Leetcode理解快乐数问题解的时间复杂性

Time complexity 如何从Leetcode理解快乐数问题解的时间复杂性,time-complexity,Time Complexity,我在理解Leet代码中快乐数字问题的一个解决方案的时间复杂度分析时遇到一些困难,对于我对复杂度分析的疑问,我用粗体标出了它们,非常感谢您的建议 问题是: 链接: 问题: 写一个算法来判断一个数字是否“快乐”。 快乐数是由以下过程定义的数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1(它将保持不变),或者在不包括1的循环中无限循环。这个过程以1结尾的数字是快乐数字 例如: 投入:19 输出:真 说明: 1^2(1的平方)+9^2=82 8^2+2^2=68 6^

我在理解Leet代码中快乐数字问题的一个解决方案的时间复杂度分析时遇到一些困难,对于我对复杂度分析的疑问,我用粗体标出了它们,非常感谢您的建议

问题是:

链接:

问题:

写一个算法来判断一个数字是否“快乐”。 快乐数是由以下过程定义的数字:从任何正整数开始,用其数字的平方和替换该数字,然后重复该过程,直到该数字等于1(它将保持不变),或者在不包括1的循环中无限循环。这个过程以1结尾的数字是快乐数字

例如:

投入:19

输出:真

说明:

1^2(1的平方)+9^2=82

8^2+2^2=68

6^2+8^2=100

1^2+0^2+0^2=1

代码如下:

类解决方案(对象):
def isHappy(自我,n):
#getnext函数将计算n的每个数字的平方和
def getnext(n):
总和=0
当n>0时:
n、 v=divmod(n,10)
总和+=v**2
返回总和
#我们声明将其视为一组,以跟踪我们已经访问过的号码
seen=set()
#我们停止检查以下情况:要么该数字达到1,要么该数字已被访问(例如一个周期)
而n=1和(n未显示):
见。添加(n)
n=获取下一个(n)
返回n==1
注意:如果我需要解释代码是如何工作的,请随时告诉我

时间复杂性分析:

时间复杂度:O(243*3+logN+logN+logN)..=O(logN)

查找给定数字的下一个值的代价是O(logN),因为我们正在处理数字中的每个数字,而数字中的位数由logN给出。 我的疑问:为什么数字中的位数由logN给出?这是什么?特定数字的值或其他值?

要计算出总的时间复杂度,我们需要仔细考虑链中有多少个数字,它们有多大

我们在上面确定,一旦一个数字低于243,它就不可能恢复到243以上。因此,根据我们非常肤浅的分析,我们可以确定,一旦一个数字低于243,它就不可能再采取243个以上的步骤来终止

每个数字最多有3位数字。通过进一步分析,我们可以将243替换为243以下最长数字链的长度,但是,因为该常数无论如何都不重要,所以我们不会担心它。 我的疑问:我认为上述段落与243*3的时间复杂度部分有关,但我无法理解为什么我们将243乘以3


对于n大于243的情况,我们需要考虑链中每个数大于243的成本。通过一点数学计算,我们可以证明在最坏的情况下,这些成本将是O(logn)+O(logn)+O(logn)。。。幸运的是,O(logN)是主要的部分,而其他部分相比之下都很小(总体而言,它们的总和小于logN),因此我们可以忽略它们我的疑问:对于243以上的n,O(logn)O(logn)背后的原因是什么?

好吧,我对第一个疑问的猜测是,基数为10的数字的位数是由它的值(n)取到基数为10的对数,向下四舍五入得到的。例如,1023将有
floor(log10(1023))
数字,即3。是的,N是这个数字的值。时间复杂度中的
log
表示对数,而不是基数2或基数e的对数


至于第二个疑问,可能与将数字减少到243以下所需的工作有关,但我不确定。一旦我算出那一部分,我就会编辑这个答案。

假设
N
M
位。比
getnext(N)解释适用于兔子和乌龟算法,不在这里。@PiyushBag,为什么不在这里?