Given a positive integer n, find the least number of perfect square
numbers (for example, 1, 4, 9, 16, …) which sum to n.Example 1:
Input: n = 12 Output: 3 Explanation: 12 = 4 + 4 + 4. Example 2:
Input: n = 13 Output: 2 Explanation: 13 = 4 + 9.
1、公式
2、动态规划,80ms
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,0);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
int ret = INT_MAX;
for (int j = 1; j*j <= i;++j)
{
if (j*j==i) {
ret = 1;
}
else if (ret > dp[i - j*j] + dp[j*j]) {
ret = dp[i - j*j] + dp[j*j];
}
}
dp[i] = ret;
//cout << dp[i] << endl;
}
return dp[n];
}
};
3、BFS搜索,28ms
class Solution {
public:
int numSquares(int n) {
vector<int> squres;
for (int i = 1; i*i <= n; ++i) { //产生平方数
squres.push_back(i*i);
}
queue<int> myq;
vector<bool> marked(n+1,false);
myq.push(n);
marked[n] = true;
int level = 0;
while (!myq.empty()){
int size = myq.size();
++level;
while (size-- > 0) {
int cur = myq.front();
myq.pop();
for (int s : squres) {
int next = cur - s;
if (next < 0) {
break;
}
if (next == 0) {
return level;
}
if (marked[next]) {
continue;
}
marked[next] = true;
myq.push(next);
}
}
}
return n;
}
};