Perfect Squares
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...
) which sum to n.
For example, given n = 12
, return 3
because 12 = 4 + 4 + 4
; given n = 13
, return 2
because 13 = 4 + 9
.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
分析:
动态规划题。设f[i]表示当n为i时squares数的值。
有 f[i] = (1) 1; 如果根号i为整数
(2) min(f[i - k**2] + 1); k取值区间为[1**2, 2**2, 3**2, 4**2 ... j**2],其中j**2 < i
有两种思路,一种是从顶往下的方式,这种需要用到递归,因为,当前f[i]的值需要依赖由i之前的值进行计算。这种方式在n很大时会超时。
另一种方式是从底往上计算,不需要递归,但是需要计算从1到i之间每一个数的f[i]值。
这题很奇怪,我在使用Python时一直超时,而同样地算法改成C++实现后则顺利通过。我怀疑Python的list在生成大数组时耗时多,但是改成字典或者使用append方式均超时,没办法只好换个语言试一下。
代码:
class Solution {
public:
int numSquares(int n) {
int f[100000];
memset(f, 0, sizeof(f));
f[1] = 1;
for(int i = 2 ; i <= n ; i++){
int mins = 10000;
int j = 1;
while(j*j <= i){
if(j*j == i){
mins = 1;
break;
}
if(f[i - j*j] + 1 < mins){
mins = f[i - j*j] + 1;
}
j++;
}
f[i] = mins;
}
return f[n];
}
};