问题
给出一个正整数n,求出总和为n的最小平方数(例如1、4、9、16,...)。
示例1: 输入:n = 12 输出3 说明:12 = 4 + 4 + 4
示例2: 输入:n = 13 输出2 说明:13 = 4 + 9。
建议的解决方案(BFS)
def numSquares(self, n):
if n < 2:
return n
lst = []
i = 1
while i * i <= n:
lst.append( i * i )
i += 1
cnt = 0
toCheck = {n}
while toCheck:
cnt += 1
temp = set()
for x in toCheck:
for y in lst:
if x == y:
return cnt
if x < y:
break
temp.add(x-y)
toCheck = temp
return cnt
这个特定的BFS如何在O(sqrt(n))中运行?因为我在想找到平方,所以取O(sqrt(n))。因为有2个for循环,所以{for y in lst1
占O(sqrt(n)),for x in toCheck
占O(sqrt(n)),难道不应该是O(n)??
答案 0 :(得分:2)
运行时间实际上是Theta(n^(3/2))
。根据{{3}},对于整数4^a (8b + 7)
和a
,任何形式为b
的整数都可以写成四个平方之和,但不能三个。令n
为此类整数。有Omega(n)
个小于n
的数字可以写成三个平方的和,因此在while循环的最后一次迭代中,toCheck
有Theta(n)
个元素,并且lst
有Theta(n^(1/2))
。