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
.
DP做法。但是这题有个tricky的地方是可以使用静态数组,这样的话可以对所有test case只维护一个数组,当test case的数字大于数组现有数字的时候,将数组扩展到test case,从而大大降低了运行时间。
class Solution {
public:
int numSquares(int n) {
if(n <= 0) return 0;
static vector<int> dp({0});//0的时候需要初始化
while(n >= dp.size()){//这里有等于号哦,因为如果有DP[n]的话,实际上已经到数组中应当有n+1个数
int num = INT_MAX;
int len = dp.size();
for(int i = 1; i * i <= len; ++ i){
num = min(num, dp[len - i * i] + 1);
}
dp.push_back(num);
}
return dp[n];
}
};