[LeetCode] 0279. Perfect Squares 完全平方数
题目
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
Example 1:
Input: n = 12
Output: 3
Explanation: 12 = 4 + 4 + 4.
Example 2:
Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.
解法一
动态规划,这是比较慢的解法,这个坑先留着,现在主要是在做BFS的题。
class Solution {
public:
int numSquares(int n) {
if (n == 0) {
return 0;
}
vector<int> steps(n + 1, INT_MAX);
steps[0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j * j <= i; ++j) {
steps[i] = min(steps[i], steps[i - j * j] + 1);
}
}
return steps[n];
}
};
解法二
最短路径,BFS
参考资料:https://blog.csdn.net/qq_17550379/article/details/80875782
思路:寻找最短路径嘛,肯定是用到广度优先搜索了,不断拆解队列中的数字,得到答案后直接返回就是最短路径了。具体的做法很简单,以下是具体BFS思路:
把n推入队列,然后取出来进行拆解(-1,-4,-9…),减掉后如果不等于0,就将余下来的值推入队列,等待第二轮搜索,如果减掉后等于0就是直接找到答案了,返回step+1即可,不需要再搜索下去了(记得要有visited昂,因为是个循环图)。
class Solution {
public:
int numSquares(int n) {
queue<pair<int, int>> q;
// pair.first 代表将n拆解后的数字,pair.second代表所走的步数
// 刚开始推入未拆解的n,步数为0
q.push(make_pair(n, 0));
bool visited[n + 1];
memset(visited, 0, sizeof(visited));
visited[n] = true;
// 开始广度优先搜索
while (!q.empty()) {
// 取队头,进行拆解
auto pair = q.front();
q.pop();
int i = 1;
int next_num = pair.first - i * i;
// 在推入队列前先看看能不能解答
while (next_num >= 0) {
if (next_num == 0) {
return pair.second + 1;
}
// 还有余数没扣完,就将可以的下一步都推入队列
if (!visited[next_num]) {
q.push(make_pair(next_num, pair.second + 1));
visited[next_num] = true;
}
// 计算下一步
i++;
next_num = pair.first - i * i;
}
}
return 0;
}
};
运行结果:
Runtime: 16 ms, faster than 86.01% of C++ online submissions for Perfect Squares.
Memory Usage: 11.6 MB, less than 24.62% of C++ online submissions for Perfect Squares.
解法三
Lagrange四平方定理:任何一个正整数都可以表示成不超过四个整数的平方之和。 推论:满足四数平方和定理的数n(四个整数的情况),必定满足 n=4^a(8b+7)。
做计算机的数学也要好啊,这个定理告诉我们,这道题的答案无非只有1、2、3、4,而且如果满足上述公式,那么答案就是4,如果不能被1个或2个完全平方数组成,那么就返回3。
(真是暴力啊,逃……
class Solution {
public:
int numSquares(int n) {
// Lagrange四平方定理:任何一个正整数都可以表示成不超过四个整数的平方之和。
// 推论:满足四数平方和定理的数n(四个整数的情况),必定满足 n=4^a(8b+7)。
while (n % 4 == 0)
n /= 4;
if (n % 8 == 7)
return 4;
int a = 0;
while (a * a <= n) {
int b = (int)sqrt(n - a * a);
if (a * a + b * b == n) {
return (a ==0 || b == 0) ? 1 : 2;
}
a++;
}
return 3;
}
};
运行结果:
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Perfect Squares.
Memory Usage: 8.4 MB, less than 90.15% of C++ online submissions for Perfect Squares.
[LeetCode] 0279. Perfect Squares 完全平方数的更多相关文章
- [LeetCode] 279. Perfect Squares 完全平方数
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- [LintCode] Perfect Squares 完全平方数
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- [LeetCode] Perfect Squares 完全平方数
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- leetcode@ [279]Perfect Squares
https://leetcode.com/problems/perfect-squares/ Given a positive integer n, find the least number of ...
- 一、Perfect Squares 完全平方数
一原题 Given a positive integer n, find the least number of perfect square numbers (, , , , ...) which ...
- Leetcode279. Perfect Squares完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释: 12 ...
- 【leetcode】Perfect Squares (#279)
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- (BFS) leetcode 279. Perfect Squares
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- [leetcode] #279 Perfect Squares (medium)
原题链接 题意: 给一个非整数,算出其最少可以由几个完全平方数组成(1,4,9,16……) 思路: 可以得到一个状态转移方程 dp[i] = min(dp[i], dp[i - j * j] + ) ...
随机推荐
- [图片问答]LODOP字体设置方法
字体设置方法:一.整体设置(针对文本项),打印初始化后.增加打印项之前调用本函数LODOP.SET_PRINT_STYLE("FontSize",11);二.单个打印项(针对文本项 ...
- vs2019 中文离线安装包下载
1. 通过在https://visualstudio.microsoft.com/zh-hans/downloads/ 下载VS2019, 之后会下载vs_enterprise__78682482.1 ...
- win7/win10 设置始终以管理员身份运行cmd窗口
在桌面上找到cmd快捷方式图标,右键"属性" 4.选择"快捷方式",点击“高级” 5.勾选用管理员身份运行,点击"确定" 6.点击" ...
- odoo 上下文
order = self.env[model].browse(id)if order: order.with_context(write_type='voucher_generation').writ ...
- OpenJudge 1088 滑雪
总时间限制: 1000ms 内存限制: 65536kB 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者 ...
- ActiveMQ学习教程
一.activemq安装 官网地址:https://activemq.apache.org/ 具体安装过程不赘述,解压即安装, 二.使用 activemq有queue和topic两种模式, 我们以qu ...
- LeetCode 75. 颜色分类(Sort Colors) 30
75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...
- KAFA优点和缺点
我们上一期的Kafka教程中,我们讨论了Kafka的Books.今天,我们将讨论卡夫卡的优势和劣势.因为,在使用之前了解任何技术的局限性非常重要,在优点的情况下也是如此.所以,让我们详细讨论卡夫卡优势 ...
- 【NOIP2017】宝藏 题解(状压DP)
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...
- mysql_重置密码
# 修改编码 ```pythonshow variables like '%char%'; #查看当前使用的编码 1.打开配置文件: vim /etc/mysql/my.cnf 2.在[client] ...