题目
给定正整数 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) {
List<Integer> list = new ArrayList<>();
int min = Integer.MAX_VALUE;
for(int i = 0;;i++){ //从0开始计算平方,直到i*i大于n,并用List记录所有1~i平方的结果
int z = i*i;
if(i>1 && n%z==0){
min = n/z;
}
if(z == n){
return 1; //存在一个常数的平方=n,直接返回1
}
if(z < n){
list.add(z);
}else{
break;
}
}
int count = 0;
int sum = 0;
int index = list.size() - 1;
while(sum!=n){
int z = sum + list.get(index);
if(z<=n){
sum = z;
count++;
}else{
index--;
}
}
int[] m = new int[]{Math.min(min,count)};
getMin(list, m, n, 0, list.size() - 1,0);
return m[0];
}
//遍历所有结果,找出个数最少的方案
private void getMin(List<Integer> list,int[] min,int n, int sum, int index, int count){
if(index <=0) return;
int z = sum + list.get(index);
if(z<=n){
if(count+1>=min[0]){
return;
}
if(n == z){
if(count + 1 < min[0]){
min[0] = count+1;
}
return;
}
getMin(list,min, n , z, index,count+1);
}
getMin(list,min, n , sum, index-1,count);
}
}