题目描述:

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

问题分析:

根据丑数的定义,我们知道丑数一定是由2、3、5乘积得到,可表示成如下公式:

我们默认1是第一个丑数,初始丑数序列为1,从1开始,得到遍历所有丑数的方法:

(1)取丑数序列第1个数1×2、3、5得到2、3、5,丑数序列为1、2、3、5;

(2)取丑数序列第2个数2×2、3、5得到4、6、10,丑数序列为1、2、3、5、4、6、10;

(3)取丑数序列第3个数3×2、3、5得到6、9、15,丑数序列为1、2、3、5、4、6、10、6、9、15;

.......

依次类推,我们是可以遍历得到所有的丑数,但是会发现丑数序列中不断的会出现重复的数,且丑数序列也没有排序,边遍历边排序的方法肯定不是解决问题的方法,期望在此寻找丑数方法的基础上改进。

解题思路:

解题基本思路是分别对基数2、3、5维护3个队列,每个队列记录自己得到的丑数序列:

(1)取丑数序列第1个数1,取3个队列中队头最小的入队,得到丑数序列为1、2

queue_2:2

queue_3:3

queue_5:5

(2)取丑数序列第2个数2,取3个队列中队头最小的入队,得到丑数序列为1、2、3

queue_2:2、4

queue_3:3、6

queue_5:5、10

(3)取丑数序列第2个数3,取3个队列中队头最小的入队,得到丑数序列为1、2、3、4

queue_2:2、4、6

queue_3:3、6、9

queue_5:5、10、15

......依次类推,可以得到一个不含重复元素且排列有序的丑数序列。

程序设计:

解题思路中,通过维护3个序列,实现丑数数列的搜索,设丑数数组为:ugly[ ],通过解题思路中三个队列的数据我们发现,第1列的值为ugly[0]×2、3、5,第2列为ugly[1]×2、3、5,所以可以通过三个标志位flag1、flag2、flag3,分别记录循环处理每步中用于比较的3个值:2×ugly[flag1]、3×ugly[flag2]、5×ugly[flag3],值最小的进入丑数序列,同时标志位+1。

class Solution {
public:int GetUglyNumber_Solution(int index) {if(index<7)return index;vector<int> ugly;//初始化丑数序列int flag_1 = 0,flag_2 = 0,flag_3 = 0;//3个标志位int num = 1;ugly.push_back(num);while(ugly.size()<index){//选出三个队列头最小的数num = min(2*ugly[flag_1],min(3*ugly[flag_2],5*ugly[flag_3]));//这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况if(2*ugly[flag_1] == num) flag_1++;if(3*ugly[flag_2] == num) flag_2++;if(5*ugly[flag_3] == num) flag_3++;ugly.push_back(num);}return num;}
};

引申:判断一个数是否为丑数:

判断一个数是否为丑数的思路:就是这个数是否可以分解为:,解题思路:

class Solution {
public:bool isUgly(int num){if(num<1) return false;return search(num); //开始递归}bool search(int num){if(num==1) return true //递归终止//不是2,3,5的倍数,不是丑数。if(num%2 != 0 && num%3 != 0 && num%5 != 0 ) return false;else return num%2 == 0 ? search(num/2) : false || num%3 == 0 ? search(num/3) : false || num%5 == 0 ? search(num/5) : false;//递归调用}
};

刷题-丑数提取及丑数判断相关推荐

  1. leetcode力扣刷题系列python——2、两数相加

    题目: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...

  2. Leetcode刷题(2)回文数

    最好的种树是十年前,其次是现在.歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主  放弃很容易但是坚持一定很酷     我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的 ...

  3. C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3620 访问. 给定一个包括 n 个整数的 ...

  4. 刷题_25:星际密码 and 数根

    一.星际密码 题目链接: 星际密码 题目描述: 星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码.表的规则是:n对应的值是 ...

  5. 每日刷题:第四天 快乐数

    由题意得最终的结果就是循环或者等于1 法一: 分析题目可知,循环的原因是出现了重复的数字,因此使用set容器判断是否重复或者结果是否为一,若为一则返回true,若出现重复数字,则返回false 这个方 ...

  6. 算法刷题打卡第76天:判断矩阵是否是一个 X 矩阵

    判断矩阵是否是一个 X 矩阵 难度:简单 如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 : 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n ...

  7. 刷题日记【第四篇】-笔试必刷题【Fibonacci数列+合法括号序列判断+两种排序方法+求最小公倍数】

    目录 选择题模块 1. 以下对继承的描述错误的是(A) 2. 在Java中,一个类(B) 3. 以下不是Object 类的方法的是(D) 4. Test.main() 函数执行后的输出是(D) 编程题 ...

  8. 蓝桥杯刷题015——最少刷题数(二分法+前缀和)

    问题描述 小蓝老师教的编程课有 N 名学生, 编号依次是 1-N .第 i 号学生这学期刷题的数量是 Ai​ . 对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题比他多的学生数不超 ...

  9. ​LeetCode刷题实战314:二叉树的竖直遍历

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

最新文章

  1. 5.Spring Cloud Alibaba教程:Nacos整合Feign
  2. Session一致性的解决方案
  3. webrtc回声消除线程android,android WebRTC 示例demo源码(回音消除)
  4. hdu 5112 A Curious Matt
  5. streamsets rest api 转换 graphql
  6. leetcode1415. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯)
  7. 关于JavaScript中cookie的用法例子
  8. EasyDSS RTMP流媒体解决方案之直播录像自动清理方案
  9. HTML5 canvas游戏工作原理
  10. 有哪些送给20多岁年轻人的建议?
  11. 《跟我一起做J2EE版Blog–jPress》4(搭建marven下的Spring和Hibernate)
  12. [Java]toString的用法
  13. c语言编译错误c267,为啥编译出现HAHA.C(31): error C267: 'adc0832': requires ANSI-style prototype.......
  14. pdf不用会员怎么拆分
  15. 嵌入式面试常见问题(六)—各大公司面试题
  16. 【kafka】Flink消费kafka Error sending fetch request
  17. 关于MacBook蓝牙键盘鼠标耳机等设备各种的卡顿、黏滞、断开连接等各种问题解决方案
  18. Pr:导出设置之元数据
  19. LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
  20. 二级c语言程序基础知识,计算机二级《C语言》基本知识点

热门文章

  1. 三国群英传霸业之王服务器维护,《三国群英传2网络版》掌上助手APP曝光,三国群英传霸业之王...
  2. SVN导入项目转变为Maven项目时pom.xml报错
  3. WP8.1之小小记事本编程
  4. 多样性强化学习:不光要赢,还要赢得精彩 | 清华吴翼
  5. 支持向量机回归预测SVR——MATLAB超详细代码实现过程
  6. 地理围栏算法解析(Geo-fencing)
  7. 同花顺趋势启动,低位启动 趋势指导指标源码
  8. Y05 - 017、猜小埋年龄游戏
  9. 干物妹小埋 树状数组
  10. verilog状态机