Perfect squares

这道题就是纯序列堆砌而已,主要在于把时间复杂度优化到O(n^1.5)

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [0] * (n + 1)
        for i in xrange(1, n + 1):
            dp[i] = i
            for j in xrange(1, int(i ** 0.5) + 1):
                dp[i] = min(dp[i], dp[i - j * j] + 1)
        return dp[n]

这道题有个纯数学的O(n^0.5)的解法,任意一个数字一定可以被4个以内的小于它的数字的平方和组合而成,这是一个纯数学定理,证明就呵呵了,反正就是这么一套理论,因为是Snapchat的一道常考题,记下这个答案也是好的

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        while n % 4 == 0:
            n /= 4
        if n % 8 == 7:
            return 4
        for i in xrange(int(n ** 0.5) + 1):
            j = (n - i ** 2) ** 0.5
            if i ** 2 + int(j) ** 2 == n:
                return 2 if i != 0 and j != 0 else 1

        return 3

results matching ""

    No results matching ""