【发布时间】:2019-07-03 01:00:36
【问题描述】:
您好,我一直在研究https://leetcode.com/problems/2-keys-keyboard/,遇到了这个动态编程问题。
您从空白页上的“A”开始,完成后您会得到一个数字 n,您应该在页面上出现 n 次“A”。问题是您只允许复制 2 次操作(并且您只能复制页面上当前 A 的总数)并粘贴 --> 找到在页面上获得 n 'A' 的最小操作数。
我解决了这个问题,但后来在 leetcode 的讨论部分找到了更好的解决方案 --> 我无法弄清楚它的时间复杂度。
def minSteps(self, n):
factors = 0
i=2
while i <= n:
while n % i == 0:
factors += i
n /= i
i+=1
return factors
这种工作方式是i 永远不会大于n 的最大素数p,所以外循环是O(p),而内循环基本上是O(logn),因为我们正在划分n /= i 每次迭代。
但在我看来,我们对内循环进行了O(logn) 的总划分,而外循环是O(p),所以使用聚合分析这个函数基本上是O(max(p, logn)),这是正确的吗?
欢迎任何帮助。
【问题讨论】:
-
是的!你是绝对正确的。
-
嗯,但是
i循环总是转到原来的 n+1 —— n 是否改变也没关系。我认为代码应该用i=2; while i <= n: ... i+=1替换for循环 -
哎呀,你是绝对正确的,保罗感谢您的注意。这个算法基本上是 O(n) 然后 ...
-
什么是
p?你的意思是n'? -
您好 Jim 抱歉耽搁了,不,我的意思是
p,其中 p 是n的最大素数。你是对的,代码没有意义,因为我将根据 Paul Hankin 的评论对其进行修改。
标签: python-3.x algorithm time-complexity