【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的存在),所以不需要判断当前数是否存在完全平方数的组合。

posted @ 2021-04-02 16:47  tmpUser  阅读(56)  评论(0编辑  收藏  举报