LeetCode-279. 完全平方数
1、题目描述
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n =12
输出:3 解释:12 = 4 + 4 + 4
示例 2:
输入:n =13
输出:2 解释:13 = 4 + 9
2、代码
#include <vector>
#include <algorithm>
using namespace std;class Solution {
public:int numSquares(int n) {// dp[i]表示和为i的最少完全平方数的数量vector<int> dp(n + 1, n); // 初始化每个数最多由n个1组成dp[0] = 0; // 和为0不需要任何数for (int i = 1; i <= n; ++i) {// 尝试所有可能的完全平方数j²for (int j = 1; j * j <= i; ++j) {// 更新dp[i]为最小值dp[i] = min(dp[i], dp[i - j * j] + 1);}}return dp[n];}
};
3、解题思路
- 初始化:我们将
dp
数组的大小设为n+1
,并将每个元素初始化为n
,这是因为最坏情况下,任何数i
都可以表示为i
个 1 的和(1 是最小的完全平方数)。 - 状态转移:对于每个数
i
,我们检查所有可能的完全平方数j²
(j
从 1 开始,直到j²
大于i
)。对于每个有效的j²
,我们计算dp[i - j²] + 1
,这表示使用一个j²
后,剩下的和i - j²
所需的最少完全平方数数量再加 1。我们取这些值中的最小值作为dp[i]
的最终值。 - 填充 dp 数组:对于每个数
i
(从 1 到 n),我们考虑所有可能的完全平方数j²
(其中j² ≤ i
),并通过dp[i - j²] + 1
来更新dp[i]
,再强调一遍,因为如果使用了一个j²
,那么剩下的和是i - j²
,最少数量就是dp[i - j²]
再加 1。 - 结果:经过上述计算后,
dp[n]
中存储的就是和为n
的最少完全平方数的数量。