给定正整数 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. 127. Leetcode 242. 有效的字母异位词 (哈希表)
  2. tkinter笔记:scale 尺度 (莫烦python笔记)
  3. 剑指offer-跳台阶
  4. SAP C4C Opportunity和SAP ERP Sales流程的集成
  5. VarianceThreshold
  6. 可显示上拼音下汉字的 text 格式
  7. 计算机怎么怎么打文件夹加密文件,电脑文件夹怎么加密 4种文件夹加密方法
  8. php转义和反转,PHP转义,反转义
  9. 平凡的女人,伟大的奉献
  10. 前端页面调用微信扫一扫功能
  11. SQL注入学习日记(一)
  12. 5分制绩点计算器_这道小学算术题,居然会让手机计算器“智障”
  13. c语言 星座运势,第十一周 OJ总结-日期妙算星座
  14. Hutool-crypto加密工具
  15. 怎么打造小红书爆款笔记账号?教你几招
  16. codeblocks如何去掉后面的dos窗口
  17. Vue.Draggable 文档总结
  18. Libreoffice 启动或重启命令
  19. linux3.0 usb键盘驱动,USB3.0驱动下载
  20. 【Linux操作】使用zip 压缩命令打包程序为.zip压缩包并进行解压缩

热门文章

  1. unix_timestamp、from_unixtime时间戳函数的使用
  2. 【实习之路】投了109份简历,幸运的大二菜鸡终于拿到欢聚时代的offer了!!
  3. python窗口大小动态变化_如何在tkinter中动态调整窗口大小以“自动调整”其内容?...
  4. 钕铁硼产品磁性能相对检测原理与技术
  5. telnet不是内部或外部命令怎么办
  6. 【干货】长达4万字的Java知识点!
  7. 阿里云服务器配置远程打印机,电脑启用打印服务器配置
  8. PXE+pxelinux+binlsrv+tftpd32远程安装windows 2003及心得
  9. UML之教学管理系统——1、需求分析
  10. Vi下编辑和退出编辑方法