给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

示例 1:

输入: n = 
12

输出: 3 
解释: 
12 = 4 + 4 + 4.
示例 2:

输入: n = 
13

输出: 2
解释: 
13 = 4 + 9.

很多人第一眼看到这个问题,想到的第一种做法就是使用贪心算法,但是对于这个问题是不适用的,例如:

如果贪心来做,12 = 9 + 1 + 1 + 1,所以答案为4了,但是实际答案是3。

Lagrange 四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。

引理 1 (Euler 四平方恒等式): (a2+b2+c2+d2)(w2+x2+y2+z2) = (aw+bx+cy+dz)2 + (ax-bw-cz+dy)2 + (ay+bz-cw-dx)2 + (az-by+cx-dw)2, 其中 a, b, c, d, w, x, y, z 为任意整数。

引理 2: 如果一个偶数 2n 是两个平方数之和, 那么 n 也是两个平方数之和。

引理 3: 如果 p 是一个奇素数, 则存在正整数 k, 使得 kp = m2+n2+1 (其中 m, n 为整数)。

还有一个重要的推论:

我们可以先判断这个数是否满足,如果是,那就ans=4;

完整代码为

class Solution{
private:int is_square(int n){int sqrt_n = (int)(sqrt(n)); //强制转换 int i;float f; f=(float)i;return (sqrt_n*sqrt_n == n);}
public:int numSquares(int n){// If n is a perfect square, return 1.if (is_square(n)){return 1;}// The result is 4 if and only if n can be written in the // form of 4^k*(8*m + 7). Please refer to // Legendre's three-square theorem.while ((n & 3) == 0) {// n%4 == 0  n >>= 2; //左移2位  4^a}if ((n & 7) == 7){ // n%8 == 7return 4;}// Check whether 2 is the result.int sqrt_n = (int)(sqrt(n));for (int i = 1; i <= sqrt_n; i++){if (is_square(n - i*i)){return 2;}}return 3;  //其他是3}
};

不过这题用动态规划很容易理解

class Solution{
public:int numSquares(int n)    {if (n <= 0)        {return 0;}vector<int> cntPerfectSquares(n + 1, INT_MAX);cntPerfectSquares[0] = 0;for (int i = 1; i <= n; i++)   {// For each i, it must be the sum of some number (i - j*j) and // a perfect square number (j*j).for (int j = 1; j*j <= i; j++)  {cntPerfectSquares[i] = min(cntPerfectSquares[i], cntPerfectSquares[i - j*j] + 1);}}return cntPerfectSquares.back();}
};

四平方和定理 leetcode279 c++相关推荐

  1. leetcode279 拉格朗日四平方和定理

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

  2. 两数平方和定理,勒让德三平方和定理,拉格朗日四平方和定理

    婆罗摩笈多-斐波那契恒等式 婆罗摩笈多-斐波那契恒等式(Brahmagupta–Fibonacci identity): ( a 2 + b 2 ) ( c 2 + d 2 ) = ( a c − b ...

  3. Pollard_rho大数质因数分解+拉格朗日四平方和定理(bzoj 2904: 平方和)

    2904: 平方和 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 160  Solved: 73 [Submit][Status][Discuss] ...

  4. 拉格朗日四平方和定理

    目录 一,拉格朗日四平方和定理 二,证明过程 三,推论 四,OJ实战 CSU 1404 Four-square Theorem 力扣 279. 完全平方数 一,拉格朗日四平方和定理 每个正整数均可表示 ...

  5. 第四平方和定理,用c语言实现

    1.实验题目 1.7[问题描述] 第四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.  如果把0包括进去,就正好可以表示为4个数的平方和.比如:5 = 0^2 + 0^ ...

  6. xjoi 1542 玩玩拉格朗日四平方和定理

    题目描述: 拉格朗日四平方和定理: 每一个非负整数都可以表示成四个非负整数的平方和. 例如 5 = 0^2 + 0^2 + 1^2 + 2^2 给定一个正整数n,请你将n拆成 a^2+b^2+c^2+ ...

  7. C语言编程四平方和定理,第四平方和定理,用c语言实现

    1.实验题目 1.7[问题描述] 第四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.  如果把0包括进去,就正好可以表示为4个数的平方和.比如:5 = 0^2 + 0^ ...

  8. 四平方和定理(拉格朗日定理)

    题目 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 ...

  9. 【LeetCode】279. 完全平方数 【动态规划】【四平方和定理】

    题目链接:https://leetcode-cn.com/problems/perfect-squares/ 题目介绍 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使 ...

最新文章

  1. winform实现翻书效果_如何用PPT实现翻书效果?
  2. 分布式大数据sql查询引擎Presto初识
  3. 百度SEOB2B/论坛/网站自动更新/发布程序
  4. Spark写入MySQL报错乱码+报错
  5. linux网络协议栈 转发组播,Linux 网络协议栈开发基础篇(十)—— 组播(Multicast)基础...
  6. poj 3624 Charm Bracelet (01背包)
  7. Virtio SCSI设备介绍
  8. Salesforce入门教程(中文)-020 VF使用静态资源移动端开发(未完)
  9. echo命令的15个用法
  10. 百度相关搜索是怎么出现的如何利用
  11. win2008 mysql 群集_win2003服务器下配置 MySQL 群集(Cluster)的方法 -电脑资料
  12. [LeetCode]Burst Balloons 爆气球
  13. 文件服务器 excle 变为temp,WPS的excel表格保存之后变成tmp_共享文档无法保存EXCLE 生成TMP...
  14. ipad微信号无法连接服务器,ipad微信内置浏览器无法微信登录
  15. 内网异地备份_用批处理实现局域网内的异地备份
  16. 数据分析项目实战项目二:入驻商用户画像体系
  17. 咖说 | 「延展与重构」数字艺术的新可能
  18. 最大扇入数怎么判断_实战分享——百家号怎么运营获得稳定收益
  19. 电脑中常用的“扇区”、“簇”、“块”、“页”等概念
  20. 工程材料(3.2)热处理-普通铸铁

热门文章

  1. matlab求解解析解,Matlab中解析解与数值解的区别
  2. 什么样的人才是幸福的?
  3. CF1132B Discounts题解
  4. 当经济危机席卷日本时,松下幸之助:生产可以减半,员工不可以裁
  5. Autosar代码包初识 3 - 创建RH850的GreenHills工程编译Autosar Demo工程
  6. C++ Point类求两点距离
  7. Android ViewFliper
  8. 二叉树的前序遍历-python
  9. MySQL 数据库的基本操作
  10. English--美式发音