279. 完全平方数

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

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

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

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

class Solution {
public:
    int numSquares(int n) {
        vector<int>dp(n+1,n);
        dp[0]=0;
        for(int i=1;i<n+1;i++)
        {
            for(int j=0;j*j<=i;j++){
                dp[i]=min(dp[i],dp[i-j*j]+1);
            }
        }
        return dp[n];

    }

};

创建一个长度为 n+1 的向量 dp,其中 dp[i] 表示和为 i 的最小完全平方数个数。

首先将 dp 向量初始化为 n,因为任何正整数都可以表示为至多 n 个完全平方数之和。然后我们将 dp[0] 设为 0,因为 0 的最小完全平方数个数为 0。

接下来,遍历从 1 到 n 的所有整数。对于每个整数 i,找到所有小于或等于 i 的完全平方数 j^2,并更新 dp[i] 为 dp[i] 和 dp[i - jj] + 1 中的较小值。这是因为如果我们可以用 dp[i - jj] 个完全平方数表示 i - jj,那么我们只需要再加一个 jj(也就是dp[i-j*j]+1) 就可以表示 i。

最终,我们返回 dp[n],即和为 n 的最小完全平方数个数。

posted @ 2024-05-17 11:25  东岸  阅读(5)  评论(0编辑  收藏  举报