1.题目
2.解法
①队列+bfs
class Solution {
public int numSquares(int n) {
List<Integer> squares = generateSquares(n);
Queue<Integer> queue = new LinkedList<>();
int res = 0;
boolean[] marked = new boolean[n + 1];
queue.offer(n);
marked[n] = true;
while(!queue.isEmpty()){
int size = queue.size();
res += 1;
for(int i = 0; i < size; i++){
int temp = queue.poll();
for(int square : squares){
int next = temp - square;
if(next < 0) break;
if(next == 0) return res;
if(marked[next]) continue;
queue.offer(next);
marked[next] = true;
}
}
}
return res;
}
private List<Integer> generateSquares(int n){
List<Integer> squares = new ArrayList<>();
int start = 1;
int diff = 3;
while(start <= n){
squares.add(start);
start += diff;
diff += 2;
}
return squares;
}
}
②一维数组+动态规划
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for(int i = 0; i < n; i++){
for(int j = 1; i + j * j <= n; j++){
if(dp[i] + 1 < dp[i + j * j]) dp[i + j * j] = dp[i] + 1;
}
}
return dp[n];
}
}