1,题目要求
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.
给定正整数n,找到总和为n的最小正方数(例如,1,4,9,16 …)。
2,题目思路
对于这道题,题目要求的是给定一个数字,找到让平方数字之和等于它的最小的数字个数之和。
如果转化为即几何问题,那么就是给定一块区域,如何防止最少的正方向,将其填满。
对于这个问题,我们可以使用递归的策略来对最小的举行情况进行检测。
在进行检索的过程中还有一点值得注意的是,因为边长为1的矩形也是满足情况的,因此,对于给定的数字n,那么最极端的情况就是利用边长为1的矩形将其填满。因此,当矩形的个数达到n时,说明在极端情况下,实现了问题的要求。
3,代码实现
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int numSquares(int n) {
static vector<int> res {0}; //用于对全为1的情况下的判断
if(res.size() > n)
return res[n];
int minSquare = INT_MAX;
for(int i = 1;(i*i) <= n;i++)
minSquare = min(minSquare, 1 + numSquares(n - i*i)); //递归地寻找所需要的最少的矩形个数
res.push_back(minSquare);
return minSquare;
}
};