279. 完全平方数https://leetcode.cn/problems/perfect-squares/description/?envType=study-plan-v2&envId=top-100-liked这题我想的递推式本来是这样的:;用记忆化递归结果超时了。看了一下题解发现其实上式的i完全可以只考虑是完全平方数的情况。所以其实递归式是这样的:,而肯定是1,所以最终递推式为:。
我还是用的记忆化递归,因为个人感觉记忆化递归比动态规划更通用一些,而且写起来更简单,虽然效率可能会差一些。如下。
class Solution {
public:
int numSquares(int n) {
vector<int> mem(n + 1, 0);
function<int (int)> f = [&] (int x) -> int {
if (mem[x] != 0) return mem[x];
int i = sqrt(x);
if (i * i == x) {
mem[x] = 1;
return 1;
}
int res = INT_MAX;
for (int j = 1; j*j <= x/2; ++j) {
res = min(res, 1 + f(x-j*j));
}
mem[x] = res;
return res;
};
return f(n);
}
};