279. Perfect Squares(dp)

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

 

Example 1:

Input: n = 12
Output: 3 
Explanation: 12 = 4 + 4 + 4.

Example 2:

Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.

1、自底向下的动态规划

class Solution {
public:
    //子问题、最小个数
    int numSquares(int n) {
        vector<int> dp(n+1,n);
        dp[0] = 0;
        dp[1] = 1;
        for(int i=2;i<=n;i++){
            for(int j=1;j*j<=i;j++){
                dp[i] = min(dp[i],dp[i-j*j]+1);
            }
        }
        return dp[n];
    }
};

 

法二:

1、拉格朗日四平方和定理

每个正整数均可表示为四个整数的平方和。证明:https://i.cnblogs.com/posts/edit

 2、在数学中,勒让德的三平方定理指出,自然数 可以表示为三个整数的平方和:当且仅当n不是形式 n = 4 ^ a(8b + 7),对于非负整数a和b。

class Solution {
public:
    //数学法
    bool is_square(int n) {
        if(int(sqrt(n))*int(sqrt(n)) == n)
            return true;
        return false;
    }
    //由拉格朗日四平方定理,结果只能是1、2、3、4
    int numSquares(int n) {
        //先判段是不是1
        if(is_square(n)) return 1;
        //再判断是不是4:当且仅当n不是形式 n = 4 ^ a(8b + 7):非负整数a和b,自然数 可以表示为三个整数的平方和
        int m = n;
        while(m%4 == 0){
            m/=4;
        }
        if(m%8 == 7) return 4;
        //再判断是不是2
        for(int i=1;i<n;i++){
            if(is_square(i) && is_square(n-i))
                return 2;
        }
        
        return 3;
    }
};

 

posted on 2020-11-21 22:18  wsw_seu  阅读(95)  评论(0编辑  收藏  举报

导航