279. 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
.
本题主要采用递归及DP的思想,用一个map记录计算过的n对应的最少Perfect Squares,
递归式:
n==0 : return 0
其它:return min{numSquares(n%i^2 )+n/i^2 | i∈[1,√n]}
class Solution {
public:
int numSquares(int n) {
if(n==0) return 0;
if (record.count(n)) //已经计算过,直接将结果返回
{
return record[n];
}
int miniCount = INT_MAX;
for (int i=sqrt(n);i>0;--i)
{
int power = i*i;
miniCount = min(numSquares(n%power)+n/power,miniCount); //递归式求取
}
record[n] = miniCount; //将结果记录(DP)
return miniCount;
}
private:
map<int,int> record;
};