目录

0279:完全平方数(★)

力扣第 279 题

题目

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 1:

输入:n = 12
输出:3
解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 104

分析

将平方数看成元素,即是完全背包问题。

解答

1
2
3
4
5
6
7
class Solution:
    def numSquares(self, n: int) -> int:
        f = [0]+[inf]*n
        for x in range(1,n+1):
            for j in range(x*x,n+1):
                f[j] = min(f[j],1+f[j-x*x])
        return f[-1]

2518 ms

*附加

  • 根据数学上的 四平方和定理,每个正整数均可表示为4个整数的平方和
  • 因此只需逐层遍历 i 个正整数平方的和,找到 n 即可
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution:
    def numSquares(self, n: int) -> int:
        Q, vis = deque([(0, 0)]), {0}
        while True:
            u,w = Q.popleft()
            for j in range(1,isqrt(n-u)+1):
                v = u+j*j
                if v==n:
                    return w+1
                if v not in vis:
                    vis.add(v)
                    Q.append((v,w+1))

时间 $O(\sqrt N)$,169 ms