暴搜dfs
class Solution {
public int numSquares(int n) {
return dfs(n);
}
public int dfs(int n){
int val = (int)Math.sqrt(n);
if(val*val == n){
return 1;
}
int min = Integer.MAX_VALUE;
for(int i=1;i*i<=n;i++){
min=Math.min(min,dfs(n-i*i)+1);
}
return min;
}
}
记忆化dfs
class Solution {
public int numSquares(int n) {
int[] dp = new int[n+1];
dfs(n,dp);
return dp[n];
}
public int dfs(int n, int[] dp){
if(dp[n]!=0){
return dp[n];
}
int val = (int)Math.sqrt(n);
if(val*val == n){
return dp[n]=1;
}
int min = Integer.MAX_VALUE;
for(int i=1;i*i<=n;i++){
min=Math.min(min,dfs(n-i*i,dp)+1);
}
return dp[n]=min;
}
}
动态规划
一维线性dp问题
dp[i]表示i时的最小平方数和的方案数
初始化:等于i,最大方案数的情况是全部由1相加
自底向上的DP,保证dp[i]最小时,再去更新dp[i+1]
class Solution {
public int numSquares(int n) {
if(n==0){
return 0;
}
int[] dp = new int[n+1];
for(int i=0;i<=n;i++){
dp[i]=i;
}
for(int i=2;i<=n;i++){
for(int j=1;j*j<=i;j++){
dp[i]=Math.min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
}
BFS(求最短距离等最小值时,一般用BFS)
class Solution {
public int numSquares(int n) {
Queue<Integer> q = new LinkedList<>();
q.add(0);
int[] dist = new int[n+1];
Arrays.fill(dist,Integer.MAX_VALUE);
dist[0]=0;
while(q.size()>0){
int t = q.poll();
if(t == n){
return dist[n];
}
for(int i=1;i*i+t<=n;i++){
int j = i*i + t;
if(dist[j] > dist[t] + 1){
dist[j]=dist[t]+1;
q.add(j);
}
}
}
return 0;
}
}