求一个正整数n(如13),等于一些数的平方之和相加(如1,4,9,16),并且这些数的个数最少,列出这些数?

*这里使用动态规划来做。时间复杂度O(nlogn),空间复杂度O(n)。
*定义一个函数f(n)表示我们要求的解。f(n)的求解过程为:

f(n) = 1 + min{
f(n-1^2), f(n-2^2), f(n-3^2), f(n-4^2), ... , f(n-k^2) //(k为满足k^2<=n的最大的k)
}
*/
class Solution {
public:
int numSquares(int n) {
vector<int> f(n+1, 0);//n+1大小,f[0]为0
for (int i = 1; i <= n; i++) {//从f[1]开始计算
int minVal = INT_MAX;
for ( int j = 1; j*j <= i ; j++ ) minVal = min(minVal, f[i - j*j]);
f[i] = minVal + 1;
}
return f[n];
}
};

​更多解法​