要求

  • 给出一个正整数n,寻找最少的完全平方数,使他们的和为n

示例

  • n = 12
  • 12 = 4 + 4 + 4
  • 输出:3

边界

  • 是否可能无解

思路

  • 贪心:12=9+1+1+1,无法得到最优解
  • 图论:从n到0,每个数字表示一个节点,如果两个数字x到y相差一个完全平方数,则连接一条边
  • 问题转化为无权图中从n到0的最短路径

  

实现

  • 队列中每个元素是一个pair对,保存具体数字和经历了几段路径走到这个数字
 1 class Solution {
2 public:
3 int numSquares(int n) {
4
5 assert( n > 0 );
6
7 queue< pair<int,int> > q;
8 q.push( make_pair( n , 0 ) );
9
10 while( !q.empty() ){
11 int num = q.front().first;
12 int step = q.front().second;
13 q.pop();
14
15 if( num == 0 )
16 return step;
17
18 for( int i = 1 ; num - i*i >=0 ; i ++ )
19 q.push( make_pair( num - i * i , step + 1 ) );
20 }
21
22 throw invalid_argument("No Solution");
23 }
24 };
  • 有些节点被重复推入队列,n足够大时存在性能问题
  • 不同于树,图中每个节点都有多种路径到达

优化

  • 用一个辅助向量 visited 记录节点是否推入过队列
  • 用变量记录num-i*i,减少计算
  • 推入0时,直接返回结果,而不需要在循环处先取出
 1 class Solution {
2 public:
3 int numSquares(int n) {
4
5 assert( n > 0 );
6
7 queue< pair<int,int> > q;
8 q.push( make_pair( n , 0 ) );
9
10 vector<bool> visited(n+1, false);
11 visited[n] = true;
12
13 while( !q.empty() ){
14 int num = q.front().first;
15 int step = q.front().second;
16 q.pop();
17
18 for( int i = 1 ; ; i ++ ){
19 int a = num - i*i;
20 if( a < 0 )
21 break;
22 if( a == 0)
23 return step + 1;
24 if( ! visited[a] ){
25 q.push( make_pair( a , step + 1 ) );
26 visited[a] = true;
27 }
28 }
29 }
30 throw invalid_argument("No Solution");
31 }
32 };

相关

  • 127 Word Ladder
  • 126 Word Ladder II

[刷题] 279 Perfect Squares的更多相关文章

  1. 花式求解 LeetCode 279题-Perfect Squares

    原文地址 https://www.jianshu.com/p/2925f4d7511b 迫于就业的压力,不得不先放下 iOS 开发的学习,开始走上漫漫刷题路. 今天我想聊聊 LeetCode 上的第2 ...

  2. (BFS) leetcode 279. Perfect Squares

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

  3. [LeetCode] 279. Perfect Squares 完全平方数

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

  4. 279. Perfect Squares

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

  5. leetcode@ [279]Perfect Squares

    https://leetcode.com/problems/perfect-squares/ Given a positive integer n, find the least number of ...

  6. 279. Perfect Squares(动态规划)

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

  7. [leetcode] #279 Perfect Squares (medium)

    原题链接 题意: 给一个非整数,算出其最少可以由几个完全平方数组成(1,4,9,16……) 思路: 可以得到一个状态转移方程  dp[i] = min(dp[i], dp[i - j * j] + ) ...

  8. 【LeetCode】279. Perfect Squares 解题报告(C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 四平方和定理 动态规划 日期 题目地址:https: ...

  9. 279 Perfect Squares 完美平方数

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

随机推荐

  1. SpringBoot中整合Redis、Ehcache使用配置切换 并且整合到Shiro中

    在SpringBoot中Shiro缓存使用Redis.Ehcache实现的两种方式实例 SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这sh ...

  2. 基于阿里云托管kubernetes的版本升级

    前言 因为阿里云的knative对应得k8s版本大于1.15,而我们目前得集群环境是1.14.8,因此需要对预发环境进行版本升级.基于aliyun托管的kubernetes集群版本升级本没有什么可写, ...

  3. [Fundamental of Power Electronics]-PART I-3.稳态等效电路建模,损耗和效率-3.2 考虑电感铜损

    3.2 考虑电感铜损 可以拓展图3.3的直流变压器模型,来对变换器的其他属性进行建模.通过添加电阻可以模拟如功率损耗的非理想因素.在后面的章节,我们将通过在等效电路中添加电感和电容来模拟变换器动态. ...

  4. Markdown部分用法总结

    1.Markdown数学公式&符号 2.Cmd Markdown 公式指导手册

  5. “改造” VS Code 编辑器,一起写个插件吧!

    作者:HelloGitHub-小夏(首发于 HelloGitHub 公众号) 作为一个靠代码作为"生计"的开发者,bug 写的好不好,编辑器真的很重要!那么 Visual Stud ...

  6. 大学四年,总结一套适合小白的Java自学路线和方法

    前言篇 大家好,我是bigsai 好久不见,甚是想念,文章同时收录在回车课堂(文底阅读原文可达). 无论你是大学生还是在职人员,想学Java时,都会面临两个选择,自学或者报班.报班通常太费钱,时间又不 ...

  7. JVM JIT动态编译

    一.概述 1.1 基本概念 a. 动态编译(dynamic compilation)指的是"在运行时进行编译":与之相对的是事前编译(ahead-of-time compilati ...

  8. 转载:java.math.BigDecimal 比较大小

    BigDecimal a = new BigDecimal (101); BigDecimal b = new BigDecimal (111); //使用compareTo方法比较 //注意:a.b ...

  9. 关于CSS3背景渐变色无效问题

    无效的css[linear-gradient]写法 .loginbox{ background-color: linear-gradient(#D0D0D0, #E0E0E0, white); wid ...

  10. Python 巡检接入钉钉机器人

    前段时间,为了快速实现巡检服务器设备的健康状态,我简单的写了一个巡检工具,该工具已经可以满足我的大部分需求了,不过,每次都要自己手动去点击巡检才能知道今天设备的状态,由于每天巡检严重影响我学习逆向技术 ...