【LeetCode-279】完全平方数
问题
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
示例
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4
解答
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 1; i * i <= n; i++) {
int i2 = i * i;
for (int j = i2; j <= n; j++) {
if (dp[j - i2] == INT_MAX) continue; // 因为1的组合必定满足要求,所以这一行可以省略
dp[j] = min(dp[j], dp[j - i2] + 1);
}
}
return dp[n] == INT_MAX ? -1 : dp[n]; // 必定存在满足题目要求的组合,可以直接返回dp[n]
}
};
重点思路
本题和【LeetCode-322】零钱兑换完全相同的思路,唯一不同的点在于本题必定存在符合题目要求的组合(因为有1的存在),所以不需要判断当前数是否存在完全平方数的组合。