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完全平方数(四平方定理、递归、动态规划)相关推荐

  1. 高斯整数 / 费马平方和定理 / 拉格朗日的四平方定理

    一.高斯整数 形如 .(其中a,b是整数)的复数被称为高斯整数,高斯整数全体记作Z[i].注意到若 γ=a+bi 是高斯整数,则它是满足如下方程的代数整数: 通常我们使用希腊字母来表示高斯整数,例如α ...

  2. Lagrange 四平方定理

    1. 命题 这个介绍数学命题证明的系列设立已有两年多了, 却只写了两篇文章, 本文是第三篇. 这个系列介绍的数学命题的证明都是完整的证明[注一], 所涉及的数学命题都小有名气 (通常挂着著名数学家的名 ...

  3. 拉格朗日四平方和定理c语言,拉格朗日四平方定理的证明

    黄波 [摘 要]拉格朗日四平方定理又被称为Bachet猜想.说的是任何正整数都能被写成至多4个数的平方和.虽然定理由费马用无限下降的方法给出了证明,但证明过程很繁杂.欧拉没有成功证明定理.对这个定理第 ...

  4. leetcode 279 四平方定理

    可以用四平方和定理:任意一个正整数都可以表示为4个以内整数的平方和. 如果一个数含有因子4,那么我们可以把4都去掉,并不影响结果.比如:8去掉4,12去掉3,返回的结果都相同. 如果一个数除以8余7, ...

  5. leetcode 279. 完全平方数 bfs广度优先解法 图解 动态规划解法 c代码

    如题: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少.示例 1: 输入: n = 12 输出: 3 解释: ...

  6. python数组全部平方_LeetCode 题解 | 279. 完全平方数

    力扣 279. 完全平方数(点击查看题目) 力扣​leetcode-cn.com 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让 ...

  7. 输出四位完全平方数_LeetCode 题解 | 279. 完全平方数

    力扣 279. 完全平方数 (点击查看题目) 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 ...

  8. 四平方和定理 leetcode279 c++

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n =  12 输出: 3  解释:  ...

  9. LeetCode 279.完全平方数

    LeetCode 279.完全平方数 bfs写法,还有四平方定理,那个看不懂 public:int numSquares(int n) {vector<bool> vis(n+1,fals ...

最新文章

  1. 研究一下,如何实现一个文件系统
  2. 陕西师范大学计算机科学学院保研院校,陕西师范大学计算机科学学院(专业学位)现代教育技术保研细则...
  3. 使用Netbeans开发App Engine Java
  4. MacBook如何快速显示桌面
  5. jquery filter和not
  6. Python PyInstaller 安装 和 使用教程( 打包生成 exe )
  7. 怎样定义和引用一维数组,二维数组
  8. XCode 编辑器的shortcuts
  9. java email怎么设置端口号_java mail 设置参数
  10. miRNA数据库篇——Rfam数据库
  11. 狗屎一样的React(前言)
  12. 前端项目实战95-数组遍历继续处理
  13. 华为路由器:清除配置
  14. 【Unity 优化篇】 | 优化专栏《导航帖》,全面学习Unity优化技巧,让我们的Unity技术上升一个档次
  15. onmouseover事件中把鼠标变成小手形状
  16. 深入理解Java虚拟机-高效并发
  17. 红黑树的性质以及时间复杂度证明
  18. jdk11新特性,是否有必要从JDK8切换到JDK11
  19. lambda函数引用学习记录
  20. iOS的音频解码详解

热门文章

  1. python之numpy的用法
  2. 使用coplot()绘制多元图
  3. android studio 获取sha1keytool -list -v -keystore E:\PGY\keyStore\chunni.jks
  4. MFC(九)编辑框的控件
  5. bigdecimal负数变正数_BigDecimal
  6. 联想拯救者y520拆机装内存条
  7. 硅谷区块链考察(第二期)| Libra创始人与美国院士为你揭秘产业趋势
  8. #pragma prefast
  9. 一天1个小技巧——笔记本电脑如何截图?QQ截图在哪里?
  10. 【研】2019 届 计算机 夏令营