给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...) 使得他们的和等于 n。你需要让平方数的个数最少。
比如 n = 12,返回 3 ,因为 12 = 4 + 4 + 4 ; 给定 n = 13,返回 2 ,因为 13 = 4 + 9。

详见:https://leetcode.com/problems/perfect-squares/description/

Java实现:

方法一:递归实现

class Solution {public int numSquares(int n) {int res = n, num = 2;while (num * num <= n) {int a = n / (num * num), b = n % (num * num);res = Math.min(res, a + numSquares(b));++num;}return res;}
}

方法二:动态规划

如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a+bxb,那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。

class Solution {public int numSquares(int n) {int[] dp = new int[n+1];// 将所有非平方数的结果置最大,保证之后比较的时候不被选中Arrays.fill(dp, Integer.MAX_VALUE);// 将所有平方数的结果置1for(int i = 0; i * i <= n; i++){dp[i * i] = 1;}// 从小到大找任意数afor(int a = 0; a <= n; a++){// 从小到大找平方数bxbfor(int b = 0; a + b * b <= n; b++){// 因为a+b*b可能本身就是平方数,所以我们要取两个中较小的dp[a + b * b] = Math.min(dp[a] + 1, dp[a + b * b]);}}return dp[n];}
}

C++实现:

方法一:

class Solution {
public:int numSquares(int n) {while(n%4==0){n/=4;}if(n%8==7){return 4;}for(int a=0;a*a<=n;++a){int b=sqrt(n-a*a);if(a*a+b*b==n){return !!a+!!b;}}return 3;}
};

方法二:

class Solution {
public:int numSquares(int n) {vector<int> dp(n+1,INT_MAX);dp[0]=0;for(int i=0;i<=n;++i){for(int j=1;i+j*j<=n;++j){dp[i+j*j]=min(dp[i+j*j],dp[i]+1);}}return dp.back();}
};

方法三:

class Solution {
public:int numSquares(int n) {vector<int> dp(1, 0);while (dp.size() <= n) {int m = dp.size(), val = INT_MAX;for (int i = 1; i * i <= m; ++i){val = min(val, dp[m - i * i] + 1);}dp.push_back(val);}return dp.back();}
};

参考:https://www.cnblogs.com/grandyang/p/4800552.html

转载于:https://www.cnblogs.com/xidian2014/p/8762034.html

279 Perfect Squares 完美平方数相关推荐

  1. Leetcode 279 完美平方数

    Type: Medium, BFS 完美平方数 题目描述: Given a positive integer n, find the least number of perfect square nu ...

  2. LeetCode 279. Perfect Squares

    279. Perfect Squares Given a positive integer n, find the least number of perfect square numbers (fo ...

  3. 279. Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  4. leetcode 279. Perfect Squares | 279. 完全平方数(动态规划,Java)

    题目 https://leetcode.com/problems/perfect-squares/ 题解:动态规划 参考:[宫水三叶]详解完全背包一维空间优化推导(附背包问题攻略) 首先初始化长度为 ...

  5. leetcode -- 279. Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  6. 【Breadth-first Search 】279. Perfect Squares

    输入:一个非负整数n. 输出:这个非负整数可以写成几个完全平方数.返回这个数量. 规则:完全平方数可以表示为某个整数的平方.例如:1,4,9- 分析:13=4+9 也就是说13可以写成2个完全平方数的 ...

  7. python实现计算最少完美平方数

    目录 1.题目描述 2.代码实现 3.运行结果 1.题目描述 给一个正整数 n, 请问最少多少个完全平方数(比如1, 4, 9 ... )的和等于 n. 输入样例①:12 输出样例:3 解释:4+4+ ...

  8. Xiaohe-LeetCode 279 Perfect Squares

    (1)Best way.94% This one uses Lagrange's four-square theorem. According to it, every integer is a su ...

  9. 4kyu Sums of Perfect Squares

    4kyu Sums of Perfect Squares 题目背景: The task is simply stated. Given an integer n (3 < n < 109) ...

最新文章

  1. 全卷积神经网路【U-net项目实战】ISBI 挑战数据集图像分割-keras实现
  2. python界面设计实例-Python GUI项目实战(二)主窗体的界面设计与实现
  3. iOS高级音频的设置项
  4. Java——UPD输出及优化再优化
  5. ctf mysql hash传递_分享个 CTF 小工具 bruteHASH
  6. 蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序
  7. 首师大2计算机考研分数线,2021考研分数线:首都师范大学2021年考研复试分数线...
  8. (88)FPGA面试题-使用Verilog HDL编写二进制转格雷码
  9. java mysql大小写_MySQL大小写敏感的解决方案
  10. 有一定基础学python_有一定编程基础,有什么好的自学python的教程吗?
  11. 如何以源码安装mysql_CentOS以源码方式安装MySQL
  12. 纯VB代码取得硬盘的物理序列号
  13. 文件目录权限(chmod、chown、chgrp)umask、隐藏权限(lsattr、chattr)
  14. c语言二级考试程序设计题怎么运行,2017计算机二级C语言上机考试技巧
  15. 后911S5时代 各路ip代理的对比与选择 (仅供参考)
  16. CSS前端样式美化总结
  17. windows开机启动自定义程序和任务
  18. eai java,EAI与SOA
  19. C语言算法之将十进制数转换成二进制数
  20. 普通中继模型-吞吐量

热门文章

  1. mysql8.0 的新特性_What's New In MySQL 8.0(MySQL 8.0 新特性)
  2. ireport模块之间的动态传参及拼接SQL
  3. Tomcat - Springboot启动的时候初始化的线程池默认配置
  4. 实现java内存队列消费事件-ConcurrentLinkedQueue
  5. mysql中float、double、decimal的区别
  6. Feign Client 原理和使用
  7. sqlite中字符串含有单引号的处理
  8. uc点网页显示服务器升级,让uc浏览器网页加载速度提升100%
  9. Photoshop通道抠出散乱的儿童头发
  10. 再谈 document.documentElement 与 document.body 的 scrollWidth、offsetWidth、clientWidth