279完全平方数(四平方定理、递归、动态规划)
1、题目描述
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
2、示例
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
3、题解
解法一:
基本思想:递归,通过递归找出所有的可能,最优解赋值给res
解法二:
基本思想:数学,四平方和定理,时间复杂度O(sqrt(n))空间复杂度O(1)
1、任何正整数都可以拆分成不超过4个数的平方和 ---> 答案只可能是1,2,3,4
2、如果一个数最少可以拆成4个数的平方和,则这个数还满足 n = (4^a)*(8b+7) ---> 因此可以先看这个数是否满足上述公式,如果不满足,答案就是1,2,3了
3、如果这个数本来就是某个数的平方,那么答案就是1,否则答案就只剩2,3了
4、如果答案是2,即n=a^2+b^2,那么我们可以枚举a,来验证,如果验证通过则答案是2
5、只能是3
解法三:
基本思想:动态规划,dp[n]表示数字n需要最少的完全平方数组成,则dp[n]=1+min(dp[n-1*1],dp[n-2*2],dp[n-3*3]...dp[n-k*k]),时间复杂度O(n*sqrt(n))空间复杂度O(n)
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
class Solution {
public:int numSquares(int n) {//简化版:四平方和定理,牛顿18岁时的定理,组成一个正整数的完全平方数的个数小于等于4int i=sqrt(n);if(i*i==n)return 1;for(i=1;i*i<n;i++){int j=pow(n-i*i,0.5);if(i*i+j*j==n)return 2;}for(i=1;i*i<n;i++){for(int j=1;j*j+i*i<n;j++){int k=pow(n-i*i-j*j,0.5);if(i*i+j*j+k*k==n)return 3;}}return 4;}
};
class Solution1 {
public:int res=9999;int numSquares(int n) {//基本思想:递归,通过递归找出所有的可能,最优解赋值给resint cnt=0;Recursion(n,cnt);return res;}void Recursion(int n,int cnt){if(cnt>res)return;if(n==0){if(cnt<res)res=cnt;return;}int cur=sqrt(n);for(int i=cur;i>=cur/2;i--){Recursion(n-i*i,cnt+1);}return;}
};
class Solution2 {
public:int numSquares(int n) {//基本思想:数学,四平方和定理//时间复杂度O(sqrt(n))空间复杂度O(1)/*1、任何正整数都可以拆分成不超过4个数的平方和 ---> 答案只可能是1,2,3,42、如果一个数最少可以拆成4个数的平方和,则这个数还满足 n = (4^a)*(8b+7) ---> 因此可以先看这个数是否满足上述公式,如果不满足,答案就是1,2,3了3、如果这个数本来就是某个数的平方,那么答案就是1,否则答案就只剩2,3了4、如果答案是2,即n=a^2+b^2,那么我们可以枚举a,来验证,如果验证通过则答案是25、只能是3*/while (0 == n % 4)n /= 4;if (7 == n % 8)return 4;for (int i = 0; i * i < n; ++i) {int j = pow(n - i * i, 0.5);if (n == i * i + j * j)return !!i + !!j;}return 3;}
};
class Solution3 {
public:int numSquares(int n) {//基本思想:动态规划,dp[n]表示数字n需要最少的完全平方数组成,则dp[n]=1+min(dp[n-1*1],dp[n-2*2],dp[n-3*3]...dp[n-k*k])//时间复杂度O(n*sqrt(n))空间复杂度O(n)vector<int> dp(n+1,0);for(int i=1;i<=n;i++){int minval=INT_MAX;for(int j=1;j*j<=i;j++){minval=min(minval,dp[i-j*j]);}dp[i]=1+minval;}return dp[n];}
};
int main()
{Solution solute;int n=64352;cout<<solute.numSquares(n)<<endl;return 0;
}
279完全平方数(四平方定理、递归、动态规划)相关推荐
- 高斯整数 / 费马平方和定理 / 拉格朗日的四平方定理
一.高斯整数 形如 .(其中a,b是整数)的复数被称为高斯整数,高斯整数全体记作Z[i].注意到若 γ=a+bi 是高斯整数,则它是满足如下方程的代数整数: 通常我们使用希腊字母来表示高斯整数,例如α ...
- Lagrange 四平方定理
1. 命题 这个介绍数学命题证明的系列设立已有两年多了, 却只写了两篇文章, 本文是第三篇. 这个系列介绍的数学命题的证明都是完整的证明[注一], 所涉及的数学命题都小有名气 (通常挂着著名数学家的名 ...
- 拉格朗日四平方和定理c语言,拉格朗日四平方定理的证明
黄波 [摘 要]拉格朗日四平方定理又被称为Bachet猜想.说的是任何正整数都能被写成至多4个数的平方和.虽然定理由费马用无限下降的方法给出了证明,但证明过程很繁杂.欧拉没有成功证明定理.对这个定理第 ...
- leetcode 279 四平方定理
可以用四平方和定理:任意一个正整数都可以表示为4个以内整数的平方和. 如果一个数含有因子4,那么我们可以把4都去掉,并不影响结果.比如:8去掉4,12去掉3,返回的结果都相同. 如果一个数除以8余7, ...
- leetcode 279. 完全平方数 bfs广度优先解法 图解 动态规划解法 c代码
如题: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少.示例 1: 输入: n = 12 输出: 3 解释: ...
- python数组全部平方_LeetCode 题解 | 279. 完全平方数
力扣 279. 完全平方数(点击查看题目) 力扣leetcode-cn.com 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让 ...
- 输出四位完全平方数_LeetCode 题解 | 279. 完全平方数
力扣 279. 完全平方数 (点击查看题目) 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 ...
- 四平方和定理 leetcode279 c++
给定正整数 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 ...
最新文章
- 研究一下,如何实现一个文件系统
- 陕西师范大学计算机科学学院保研院校,陕西师范大学计算机科学学院(专业学位)现代教育技术保研细则...
- 使用Netbeans开发App Engine Java
- MacBook如何快速显示桌面
- jquery filter和not
- Python PyInstaller 安装 和 使用教程( 打包生成 exe )
- 怎样定义和引用一维数组,二维数组
- XCode 编辑器的shortcuts
- java email怎么设置端口号_java mail 设置参数
- miRNA数据库篇——Rfam数据库
- 狗屎一样的React(前言)
- 前端项目实战95-数组遍历继续处理
- 华为路由器:清除配置
- 【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次
- onmouseover事件中把鼠标变成小手形状
- 深入理解Java虚拟机-高效并发
- 红黑树的性质以及时间复杂度证明
- jdk11新特性,是否有必要从JDK8切换到JDK11
- lambda函数引用学习记录
- iOS的音频解码详解
热门文章
- python之numpy的用法
- 使用coplot()绘制多元图
- android studio 获取sha1keytool -list -v -keystore E:\PGY\keyStore\chunni.jks
- MFC(九)编辑框的控件
- bigdecimal负数变正数_BigDecimal
- 联想拯救者y520拆机装内存条
- 硅谷区块链考察(第二期)| Libra创始人与美国院士为你揭秘产业趋势
- #pragma prefast
- 一天1个小技巧——笔记本电脑如何截图?QQ截图在哪里?
- 【研】2019 届 计算机 夏令营