LeetCode 279. 完全平方数

题目描述:
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

思路:
方法一:动态规划;
方法二:数学方法:
四数平方和,即每个数都可以用四个数的平方和来表示
如果一个数n = (4^a)*(8b+7)那么它可以拆成四个数
如果n=a^a,那么它可以拆成一个数
如果n=a^a+b ^b,那么它可以拆成两个数
否则可以拆成三个数

代码如下:

class Solution {
public:
    int numSquares(int n) {
        vector<int>dp(n+1,0);
        for(int i=1;i<=n;i++){
            int temp=INT_MAX;
            for(int j=1;j*j<=i;j++){
                temp=min(temp,dp[i-j*j]);
            }
            dp[i]=temp+1;
        }
        return dp[n];
    }
};
class Solution {
public:
    int numSquares(int n) {
        while(n%4==0){
            n/=4;
        }
        if(n%8==7)  return 4;
        for(int i=0;i*i<=n;i++){
            int j=pow((n-i*i),0.5);
            if(n==i*i+j*j){
                if(i!=0&&j!=0)
                return 2;
                else return 1;
            }
        }
        return 3;
    }
};

你可能感兴趣的:(leetcode)