两种都是动态规划的方法,但第一种比较暴力和愚蠢,第二种利用了完全平方数。

方法一:无脑动态规划,会超时

解题思路:

利用一维数组存储 n 个整数的结果。

首先要判断 i 是不是 就是一个完全平方数,如果是,那就不用循环遍历后面的状态转移方程了,dp[i] = 1即可。

当 i 不是完全平方数时,状态转移方程为 dp[i] = min(dp[k] + dp[i - k]),找到最小的分割,就得到了最少完全平方数的个数。

但是会出现超时。

class Solution {
public:int numSquares(int n) {vector<int> dp(n+1, 0);dp[1] = 1;if(n == 1) return dp[n];for(int i = 2; i <= n; i++){//要先判断 i 是不是就是完全平方数int j = 1;bool flag = false;while(j * j <= i){if(j * j == i){dp[i] = 1;flag = true;break;}j++;}if(flag) continue;// n 不是完全平方数int minnum = i;for(int k = 1; k < i/2 + 1; k++){if(dp[k] + dp[i - k] < minnum){minnum = dp[k] + dp[i - k];}}dp[i] = minnum;}return dp[n];}
};

方法二:

解题思路:

自底向上(自小向大)更新 动态数组 dp。状态转移方程为 dp[i + j * j] = min( dp[i + j * j], dp[i] + 1) 。

举例如下,如果输入的 n = 12,则更新顺序为:

dp[0] --> dp[0 + 1*1] = dp[1] --> dp[0 + 2*2] = dp[4] --> dp[0 + 3*3] = dp[9]

dp[1] --> dp[1 + 1*1] = dp[2] --> dp[1 + 2*2] = dp[5] --> dp[1 + 3*3] = dp[10]

dp[2] --> dp[2 + 1*1] = dp[4] -->   ……

……

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();}
};

Leetcode 279. 完全平方数 解题思路及C++实现相关推荐

  1. LeetCode 279.完全平方数

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

  2. Leetcode 279. 完全平方数

    Leetcode 279. 完全平方数 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/perfect-squares/ ...

  3. leetcode - 279. 完全平方数

    279. 完全平方数 -------------------------------------------- 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等 ...

  4. leetcode 279. 完全平方数(dp)

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

  5. Leetcode 207. 课程表 解题思路及C++实现

    解题思路: 这是一个判断是否是有向无环图的题,也是拓扑排序题,网上的解决方案大多是从图的角度来解释的,比较复杂,下面先不管图论的内容,直接就深度优先搜索的方法来思考. 首先是建立一个graph,有多少 ...

  6. Leetcode 179. 最大数 解题思路及C++实现

    解题思路: 使用C++中的优先队列priority_queue,通过自定义比较函数cmp,来对nums数组进行排序.最后按排序结果,顺序将nums中的数push_back进字符串res中,即得到结果. ...

  7. Leetcode 134. 加油站 解题思路及C++实现

    方法一:直接暴力方法 解题思路: 当 gas[i] >= cost[i] 时,这个加油站才可能是个出发点,遍历gas容器(数组),当出现 gas[i] >= cost[i] 时,看看以这个 ...

  8. Java实现 LeetCode 279 完全平方数

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

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

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

最新文章

  1. 修改密码后服务器断开连接,SSH无需密码登录服务器且保持连接不断开的方法
  2. 编程软件python中的if用法-python 函数式编程工具
  3. Java-ReentrantLock初探
  4. 《Adobe Dreamweaver CS6中文版经典教程》——第2课 HTML基础2.1 什么是HTML
  5. 在10万以内判断,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数...
  6. 网络爬虫之Xpath用法汇总
  7. 三顿半、永璞、时萃,谁能成为下一个咖啡品类之王?
  8. 打开Excel2007都提示向程序发送命令时出现问题的解决办法
  9. MDT 2013 从入门到精通之WDS、MDT工作台配置
  10. java编写安卓计算器_安卓实现简单计算器
  11. 冯诺曼伊体系 计算机五大逻辑,科学网—再谈冯·诺伊曼结构 - 姜咏江的博文
  12. 使用Keras的面部表情识别
  13. 整体压缩跟分开压缩哪个更小_2020年新能效发布,美的空调哪个系列好?美的空调推荐...
  14. 基于平移布林通道的系统
  15. redis evict.c内存淘汰机制的源码分析
  16. SMDS:交换式多兆位数据服务--网络大典
  17. Markdown 表情包大全
  18. 书单推荐 | web前端好书推荐(一)
  19. 利用定时器实现倒计时
  20. Java怎么屏蔽骂人的词_表示嫌弃一个人的词语-高级的含蓄的骂人的话-形容很反感一个人成语...

热门文章

  1. IIS 6.0的web园 最大工作进程数
  2. Shell脚本实现生成SSL自签署证书
  3. Spring Boot2.0之 整合Redis集群
  4. 爬虫利器 puppeteer
  5. 「日常训练」Common Subexpression Elimination(UVa-12219)
  6. 遭遇OutOfMemoryError
  7. OEM中无法用sys用户登录
  8. 厦门“快捷贷”项目启动 最高可贷500万
  9. 哲理故事与管理之道(3)-不要吝惜赞美
  10. android 单个模块编译的方法