Leetcode 279. 完全平方数 解题思路及C++实现
两种都是动态规划的方法,但第一种比较暴力和愚蠢,第二种利用了完全平方数。
方法一:无脑动态规划,会超时
解题思路:
利用一维数组存储 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++实现相关推荐
- LeetCode 279.完全平方数
LeetCode 279.完全平方数 bfs写法,还有四平方定理,那个看不懂 public:int numSquares(int n) {vector<bool> vis(n+1,fals ...
- Leetcode 279. 完全平方数
Leetcode 279. 完全平方数 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/perfect-squares/ ...
- leetcode - 279. 完全平方数
279. 完全平方数 -------------------------------------------- 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等 ...
- leetcode 279. 完全平方数(dp)
题目一 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 给你一个整数 n ,返回和为 n 的完全平方数的 最少数 ...
- Leetcode 207. 课程表 解题思路及C++实现
解题思路: 这是一个判断是否是有向无环图的题,也是拓扑排序题,网上的解决方案大多是从图的角度来解释的,比较复杂,下面先不管图论的内容,直接就深度优先搜索的方法来思考. 首先是建立一个graph,有多少 ...
- Leetcode 179. 最大数 解题思路及C++实现
解题思路: 使用C++中的优先队列priority_queue,通过自定义比较函数cmp,来对nums数组进行排序.最后按排序结果,顺序将nums中的数push_back进字符串res中,即得到结果. ...
- Leetcode 134. 加油站 解题思路及C++实现
方法一:直接暴力方法 解题思路: 当 gas[i] >= cost[i] 时,这个加油站才可能是个出发点,遍历gas容器(数组),当出现 gas[i] >= cost[i] 时,看看以这个 ...
- Java实现 LeetCode 279 完全平方数
279. 完全平方数 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: ...
- leetcode 279. 完全平方数 bfs广度优先解法 图解 动态规划解法 c代码
如题: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少.示例 1: 输入: n = 12 输出: 3 解释: ...
最新文章
- 修改密码后服务器断开连接,SSH无需密码登录服务器且保持连接不断开的方法
- 编程软件python中的if用法-python 函数式编程工具
- Java-ReentrantLock初探
- 《Adobe Dreamweaver CS6中文版经典教程》——第2课 HTML基础2.1 什么是HTML
- 在10万以内判断,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数...
- 网络爬虫之Xpath用法汇总
- 三顿半、永璞、时萃,谁能成为下一个咖啡品类之王?
- 打开Excel2007都提示向程序发送命令时出现问题的解决办法
- MDT 2013 从入门到精通之WDS、MDT工作台配置
- java编写安卓计算器_安卓实现简单计算器
- 冯诺曼伊体系 计算机五大逻辑,科学网—再谈冯·诺伊曼结构 - 姜咏江的博文
- 使用Keras的面部表情识别
- 整体压缩跟分开压缩哪个更小_2020年新能效发布,美的空调哪个系列好?美的空调推荐...
- 基于平移布林通道的系统
- redis evict.c内存淘汰机制的源码分析
- SMDS:交换式多兆位数据服务--网络大典
- Markdown 表情包大全
- 书单推荐 | web前端好书推荐(一)
- 利用定时器实现倒计时
- Java怎么屏蔽骂人的词_表示嫌弃一个人的词语-高级的含蓄的骂人的话-形容很反感一个人成语...