Leetcode 279. 完全平方数 记忆化搜索
地址 https://leetcode-cn.com/problems/perfect-squares/
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9
提示:
1 <= n <= 10^4
解答
最暴力的做法就是制作一个完全平方数的表,然后各种尝试将给出的n 组成完全平方数的组合,找出最少的使用组合。
我们可以使用一个数组dp[]记录某个数的最少平方数的组合数
那么dp[n] 就是n减去某个完全平方数x的组合数加1
比如 dp[12] = dp[4]+dp[8] = dp[4]+dp[4]+dp[4]; dp[4]=1; 所以dp[8]=2; dp[12]=3;
dp[13] = dp[4]+dp[9]; dp[4]=1; dp[9]=1; dp[13]=2
代码如下
class Solution {
public:
int arr[150];
int dp[10010];
//初始化出 完全平方数
void init() {
for (int i = 0; i < 150; i++) {
arr[i] = i * i;
}
memset(dp, 0x3f, sizeof dp);
}
int solve(int n) {
int& ans = dp[n];
if(ans != 0x3f3f3f3f) {return ans;}
for (int i = 1; i <= 100; i++) {
if (arr[i] > n) break;
if (n == arr[i]) { ans = 1; return ans; }
ans = min(ans, solve(n - arr[i]) + 1);
}
return ans;
}
int numSquares(int n) {
init();
int ans = solve(n);
return ans;
}
};
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力