佇列&棧//完全平方數
阿新 • • 發佈:2018-11-11
給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...
)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例 1:
輸入: n =12
輸出: 3 解釋:12 = 4 + 4 + 4.
示例 2:
輸入: n =13
輸出: 2 解釋:13 = 4 + 9.
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=sqrt(n-i*i); if(i*i+j*j==n) { return !!i+!!j; } } return 3; } };
class Solution { public: int numSquares(int n) { vector<int> dp(n+1,INT_MAX); dp[0] = 0; for(int i = 0; i <= n; i++){ for(int j = 1; j*j+i <= n; j++){ dp[i+j*j] = min(dp[i+j*j],dp[i]+1); } } return dp[n];//return dp.back()也可以 } };
class Solution { public: int numSquares(int n) { vector<int> dp(1,0); while(dp.size() <= n){ int m = dp.size(), val = INT_MAX; for(int i = 1; i * i <= m; i++){ val = min(val, dp[m-i*i]+1); } dp.push_back(val); } return dp.back(); } };
class Solution {
public:
int numSquares(int n) {
int dp[n];
memset(dp,0,n*sizeof(n));
int res=dfs(n,0,dp);
return res;
}
private:
int dfs(int n,int count,int *dp){
if(n==0) return count;
int c=0;
if((c=dp[n-1])!=0)
return count+c;
int res=INT_MAX;
int j=(int)sqrt(n);
for(int i=j;i>=(j/2+1);i--){
int num=n-pow(i,2);
int c=dfs(num,count+1,dp);
res=min(res,c);
}
dp[n-1]=res-count;
return res;
}
};