给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
样例
给出 n = 12
, 返回 3
因为 12 = 4 + 4 + 4
。
给出 n = 13
, 返回 2
因为 13 = 4 + 9
。
思路:
递归搜索所有可能的平方数组合,找出个数最少的
第一次提交超时了,后来限制递归层数为当前找到的最少值,大于这个值的组合不会影响结果,就没必要搜了
class Solution {
public:
/**
* @param n a positive integer
* @return an integer
*/
int numSquares(int n) {
// Write your code here
int max = sqrt(n);
int r = n;
sub(n, max, 0, r);
return r;
}
void sub(int n, int max, int cur, int& r) {
if(cur >= r) return;
if(n < 0) return;
if(n == 0){
r = cur;
return;
}
for(int i = max; i >= 1; --i) {
sub(n - i * i, i, cur + 1, r);
}
}
};