给出一个正整数n,求和的最小平方数(例如1、4、9、16,...)。
示例1:
输入:n = 12
输出3
说明:12 = 4 + 4 +4。
示例2:
输入:n = 13 输出2 说明:13 = 4 + 9。
import java.util.*;
public class Solution {
public int numSquares(int n) {
int i = 1;
int ret = Integer.MAX_VALUE;
while(i * i < (n / 2)) {
int start = i * i;
int step = BFS(start,n);
if(step < ret)
ret = step;
i++;
}
return ret;
}
public int BFS(int start, int n) {
int step = 0;
LinkedList<Integer> queue = new LinkedList<Integer>();
queue.offer(start);
while(!queue.isEmpty()){
int node = queue.poll();
step++;
if(node == n)
break;
for(int k=1;k*k <= n;k++){
if(k*k <= n)
queue.offer(k * k + node);
if(node + k*k == n)
return step + 1;
}
}
return step;
}
}
我在更新步长值时遇到问题。我无法提出如何更新步长值的解决方案。有人可以帮忙吗?
答案 0 :(得分:0)
恕我直言,我将尝试通过在step
过程中检测不同marker
之间的一些levels
来更新BFS
的值,谁可以告诉我们我们正在上一个级别的末尾,并进入下一个级别。我通常将null
元素用作此marker
。
查看我的代码并附带注释,该注释已被接受
public class Solution {
public int numSquares(int n) {
Queue<Integer> queue=new LinkedList();
queue.add(n);
queue.add(null);//a null element to show the gap between two levels,i.e., the step
int res=1;
while(true){
Integer i=queue.element();
if(queue.size()!=1&&i==null){// we are hitting the marker
queue.remove();
res++;//i.e., step+1
queue.add(null);//think about why we need add an additional marker here.
}else{
Integer sqrt=(int)Math.round(Math.sqrt(i));
if(sqrt*sqrt==i){
break;
}else{
queue.remove();
for(int j=sqrt;1<=j;j--){
if(0<i-j*j)
queue.add(i-j*j);
}
}
}
}
return res;
}
}
PS,如上所述:
为方便起见,大多数标准库头文件已自动包含在内。
所以我们不做import java.util.*
,并且代码可以编译。