一. 题目描述
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
.
二. 题目分析
该题目的大意是,给出一个目标整数,算出由完全平方数累加得到目标整数的最小个数。
比较好的解决方法是使用动态规划。我们都知道一个数x
可分解为一个任意数a
加上一个平方数b * b
,即x = a + b * b
。因此,能组成目标整数x
最少的平方数个数,就是能组成a
最少的平方数个数加上1
。
三. 示例代码
class Solution {
public:
int numSquares(int n) {
static vector<int> sqrtNum(1, 0);
if(sqrtNum.size() >= n + 1) return sqrtNum[n];
while(sqrtNum.size() <= n + 1){
int temp = INT_MAX;
for(int j = 1; j * j <= sqrtNum.size(); j++)
temp = min(temp, sqrtNum[sqrtNum.size() - j * j] + 1);
sqrtNum.push_back(temp);
}
return sqrtNum[n];
}
};
四. 小结
动态规划的另一处用法。值得深入学习!
时间: 2024-10-12 17:46:31