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.
这是一道动态规划的题目。
用一个int 型数组rst[],rst[i]表示输入为i的计算结果。则有递推公式
rst[1]=min(rst[i-1*1] , rst[i-2*2], rst[i-3*3] …..)+1;
程序如下:
public class Solution {
public int numSquares(int n) {
int[] rst = new int[n + 1];
rst[0] = 0;
for (int i = 1; i <= n; i++) {
int curMin = Integer.MAX_VALUE;
int curIndex = i - 1;
int curNum = 2;
while (curIndex >= 0) {
curMin = Math.min(curMin, rst[curIndex]);
curIndex = i - curNum * curNum;
curNum++;
}
rst[i] = curMin + 1;
}
return rst[n];
}
}