要求

  • 给出一个正整数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. BUUCTF 基础CODE REVIEW

    1.说明: 题目来自于BUUCTF 的基础部分,内容就如题,是一个代码审计.代码如下: <?php /** * Created by PhpStorm. * User: jinzhao * Da ...

  2. OO电梯系列优化分享

    目录 前言 HW5 HW6 第二次作业uml协作图 HW7 第三次作业uml协作图 前言 本单元作业在优化方面确实有一些想法值得分享,故单开一篇博客分享一下三次作业的优化以及架构. 三次作业的共同之处 ...

  3. 2. IntelliJ Idea 常用快捷键列表

    Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 Ctrl+[ OR ],可以跑到大括号的开头与结尾 Ctrl+F12,可以显示当前文件的结构 ...

  4. .NET6 平台系列1 .NET发展史之.NET Framework简介

    系列目录     [已更新最新开发文章,点击查看详细] 自1995年互联网战略日以来最雄心勃勃的事业 -- 微软.NET战略, 2000年6月30日. 微软公司于2002年2月13日正式推出第一代.N ...

  5. Django 模型(Model)

    1. 模型简介 ORM 简介 使用 Mysql 数据库的环境配置 2. 定义模型 1)定义属性 2)字段类型 3)字段选项 4)关系 5)元选项 6)范例 3. 模型成员&管理器 1)类属性 ...

  6. Git 简介与仓库使用

    1. Git 简介 2. 远程仓库的使用 3. 本地仓库的使用 1. Git 简介 Git 是分布式版本控制系统,同一个 Git 仓库,可以分布到不同的机器上. 其原理是首先找一台电脑充当服务器的角色 ...

  7. POJ2983 查分约束系统

    题意:        给你n个点,然后给你两种情况,P a b c,表明a在b的北边c那么远,V a b 表明a在b的北边(距离最少是1),问你这些条件是否冲突. 思路:       一开始想用带权并 ...

  8. Android Dex文件格式解析

    Dex文件是Android虚拟机下的可执行文件,包含了应用程序所用到所有操作指令和运行时数据.在程序编译过程中,java源文件先被编译成class文件,然后通过dx工具将多个class文件整合为一个d ...

  9. Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80982869 Android系统在启动时安装应用程序的过程,这些应用程序安装好之 ...

  10. Linux配置NTP时间服务器(date、hwclock、NTP服务器的配置)

    目录 date命令 hwclock命令 NTP服务的部署 服务端 客户端 date命令 date 命令的作用是查看和设置Linux中的系统日期时间 date                      ...