完全平方数
DP其实是最好想的,宽搜其次。
时间复杂度:
class Solution {
public:
// 记忆化搜索
int vis[1000000] = {0};
int numSquares0(int n) {
if(vis[n]){
return vis[n];
}
if(n==0) return 0;
int res = 1e9;
for(int j=1;j*j<=n;j++){
res = min(res,1+numSquares(n-j*j));
}
return vis[n] = res;
}
//DP
int numSquares1(int n){
vector<int> dp(n+1,1e9);
dp[0] = 0;
for(int i=1;i<=n;i++){
for(int j=1;j*j<=i;j++){
dp[i] = min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
//BFS
int numSquares(int n){
vector<bool> vis(n,false);
queue<int> q;
int dpt = 0;
q.push(0);
while(q.size()){
int size = q.size();
while(size--){
int x = q.front();
q.pop();
for(int j=1;j*j+x<=n;j++){
if(j*j+x == n){
return dpt+1;
}
if(!vis[j*j+x]){
q.push(j*j+x);
vis[j*j+x] = 1;
}
}
}
dpt++;
}
return -1;
}
};
降维打击的数学方法就不说了,蒙~~