一. 題目描述
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 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];
}
};
四. 小結
動態規劃的另一處用法。值得深入學習!