uacs2024

导航

leetcode 279. 完全平方数(未解决)

279. 完全平方数

暴力解,勉强过了,时间复杂度很大

class Solution {
public:
    int numSquares(int n) {
        if(n <= 3)  return n;
        vector<int> dp(n+1,INT_MAX);//dp[i]表示 和为i的完全平方数的最少数量
        dp[1] = 1;dp[2] = 2;dp[3] = 3;
        for(int i = 4;i <= n;++i){
            int sqrtNum = (int)sqrt(i);
            if(sqrtNum * sqrtNum == i){
                dp[i] = 1;continue;
            }
            for(int left = 1,right = i - 1;left <= right;++left,--right){
                dp[i] = min(dp[i],dp[left] + dp[right]);
            }
        }
        return dp[n];
    }
};

 官方题解

class Solution {
public:
    int numSquares(int n) {
        // 创建一个大小为n+1的动态规划数组,dp[i]表示最少需要多少个数的平方和来表示整数i
        vector<int> dp(n + 1);
        // 遍历从1到n的每个整数i,计算每个i的最小平方和表示
        for (int i = 1; i <= n; i++) {
            // 初始化当前i的最小值为一个极大值,用于后续比较
            int minn = INT_MAX;
            // 遍历所有可能的平方数j*j,其中j*j <= i
            for (int j = 1; j * j <= i; j++) {
                // 计算i减去j*j后的数的最小平方和表示,并更新minn为更小的值
                minn = min(minn, dp[i - j * j]);
            }
            // 当前i的最小平方和表示等于minn加1(加上的j*j这个平方数)
            //具体来说,对于每个 i,我们遍历所有可能的 j,计算 i - j*j,然后查看 dp[i - j*j] 的值,这表示组成 i - j*j 所需的最少平方数的个数。
           //minn 是所有这些 dp[i - j*j] 中的最小值。
           //由于 j*j 本身是一个平方数,因此组成 i 所需的最少平方数的个数就是 dp[i - j*j] + 1,即在组成 i - j*j 的基础上再加上一个平方数 j*j。
            dp[i] = minn + 1;
        }
        // 返回n的最小平方和表示
        return dp[n];
    }
};

 

posted on 2025-03-12 20:15  ᶜʸᵃⁿ  阅读(8)  评论(0)    收藏  举报