【LeetCode】279. 完全平方数 【动态规划】【四平方和定理】
题目链接:https://leetcode-cn.com/problems/perfect-squares/
题目介绍
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 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
题解
方法一:动态规划
用dp[i]表示最少需要多少个数的平方来表示整数 i。
这些数必然落到区间。可以用枚举的方式找到这些数,当枚举到 j 时,然后再去判断 。这就变成了一个子问题。状态方程可表示为:
其中dp[0] = 0为边界条件。
时间复杂度:
空间复杂度:
方法二:四平方和定理
四平方和定理证明了任意一个正整数都可以被表示为至多四个正整数的平方和。
- 当满足 时,n 只能被表示为四个正整数的平方和,此时直接返回4.
- 当 n 是完全平方数时,放回 1.
- 当 n 可以表示为两个数的平方和时,返回 2。这一点,可以通过枚举来判断。
- 当 n 可以表示为三个数的平方和时,返回 3。但这个很难在较优的时间复杂度内解决,但根据“四平方和定理”,排除前三种情况之后,即为这种情形。
时间复杂度:
空间复杂度:
代码
// 方法一:动态规划
class Solution {public int numSquares(int n) {int[] dp = new int[n + 1];for (int i = 1; i <= n; i++) {int minn = Integer.MAX_VALUE;for (int j = 1; j * j <= i; j++) {minn = Math.min(minn, dp[i - j * j]);}dp[i] = minn + 1;}return dp[n];}
}
// 方法二:四平方和定理
class Solution {public int numSquares(int n) {if (isSquareNumber(n)) {return 1;}if (isSquare4(n)) {return 4;}for (int i = 1; i * i <= n; i++) {if (isSquareNumber(n - i * i)) {return 2;}}return 3;}// 判断是否是完全平方数boolean isSquareNumber(int n) {int sq = (int) Math.sqrt(n);return sq * sq == n;}// 判断是否能表示为 4^k * (8m + 7)boolean isSquare4(int n) {while (n % 4 == 0) {n /= 4;}return n % 8 == 7;}
}
【LeetCode】279. 完全平方数 【动态规划】【四平方和定理】相关推荐
- 279完全平方数(四平方定理、递归、动态规划)
1.题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 2.示例 输入: n = 12 输出: 3 ...
- LeetCode 279. 完全平方数(动态规划)
题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释: ...
- 拉格朗日四平方和定理
目录 一,拉格朗日四平方和定理 二,证明过程 三,推论 四,OJ实战 CSU 1404 Four-square Theorem 力扣 279. 完全平方数 一,拉格朗日四平方和定理 每个正整数均可表示 ...
- 四平方和定理(每个正整数均可表示为4个平方数的和)
定理 四平方和定理证明了任意一个正整数都可以被表示为至多四个正整数的平方和 推论 同时四平方和定理包含了一个更强的结论:当且仅当 n ≠ 4^k* (8m+7) 时,可以被表示为至多三个正整数的平方和 ...
- 【超直白】leetcode 279 完全平方数
题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释: ...
- LeetCode 279.完全平方数
LeetCode 279.完全平方数 bfs写法,还有四平方定理,那个看不懂 public:int numSquares(int n) {vector<bool> vis(n+1,fals ...
- Pollard_rho大数质因数分解+拉格朗日四平方和定理(bzoj 2904: 平方和)
2904: 平方和 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 160 Solved: 73 [Submit][Status][Discuss] ...
- leetcode279 拉格朗日四平方和定理
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 输入: n = 12 输出: 3 解释: 12 = 4 + ...
- Leetcode 279. 完全平方数
Leetcode 279. 完全平方数 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/perfect-squares/ ...
最新文章
- JGG:口腔微生物组助力妊娠糖尿病识别
- hadoop集群中的日志文件
- asp.net错误处理的三种方法
- 改变外观_“改”出来的精彩!盘点5种改变葫芦外观的技艺
- 理解Promise的3种姿势
- 教你React Native使用fetch实现图片上传
- paip.C#.net TIMER不起作用在用户控件中
- 三原色亮度最高_行业最亮88000流明三色激光投影机,为何出自中科极光“之手”?...
- C盘清理方法——基于spacesniffer软件和PatchCleaner软件
- Guitar Pro 的木吉他音色改成电吉他音色的方法
- CSS透明度opacity与IE中的透明度滤镜filter的最准确的用法
- median函数 oracle9i,oracle10g学习笔记
- Spring Boot 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统...
- Nightmare Ⅱ(BFS)
- Spring Boot使用@RepeatSubmit 防止重复提交
- 递归树求递归算法时间复杂度
- ROW_NUMBER 和OVER()分组
- 【C语言】自定义类型 结构体 枚举 联合
- 专业的开发工具:Xcode 13 for Mac
- ATK MT9V034摄像头的学习(二基础知识)
热门文章
- Linux查看全部进程的命令
- ReflectionTestUtils.invokeMethod方法的使用
- 苹果⼿手机实时和历史位置定位指南
- 请求后台时对uri进行编码——即encodeURIComponent()的使用
- 昨天你用的 YYYY-MM-dd 被同事锤了吗?
- 腾讯派息式减持京东,“伯克希尔”的投资策略变的逻辑是?
- Labview 编写TCP/IP 客户端断线重连机制程序,亲测可用
- 深入理解latch: cache buffers chains
- Edge浏览器安装油猴插件以及好用的插件推荐
- Rockchip RK3566、RK3588、RV1109系统芯片详细参数介绍