有人可以向我解释为什么Perfect Squares是O(sqrt(n))的运行时吗?

时间:2018-07-07 01:39:12

标签: algorithm runtime big-o perfect-square

  

问题

  • 给出一个正整数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)??

1 个答案:

答案 0 :(得分:2)

运行时间实际上是Theta(n^(3/2))。根据{{​​3}},对于整数4^a (8b + 7)a,任何形式为b的整数都可以写成四个平方之和,但不能三个。令n为此类整数。有Omega(n)个小于n的数字可以写成三个平方的和,因此在while循环的最后一次迭代中,toCheckTheta(n)个元素,并且lstTheta(n^(1/2))