丑数(输出第n个丑数)
题目描述:
设计一个算法,找出只含素因子2
,3
,5
的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
我们可以认为1
也是一个丑数
如果n = 9
, 返回 10
要求时间复杂度为O(nlogn)或者O(n)
代码实现:
class Solution:"""@param n: An integer@return: the nth prime number as description."""def nthUglyNumber(self, n):# write your code here'''num=0 #记录第几个只含素因子的数i=0 #记录第几个数j=1 #从1开始ans=0while num<n:ans = jwhile j / 2==1:j = j/2if j==1:num+=1j=1+anscontinuewhile j / 3 ==1:j = j/3if j==1:num+=1j=ans+1continuewhile j / 5 ==1:j = j/5if j==1:num+=1j=ans+1continuej=ans+1return ans#不知名得错误''''''i=1num=1while num<n:a=isUgly(i)i+=1if a:num +=1return idef isUgly(num):if num < 1:return Noneif num==1:return Truewhile num%2==0:num=num/2while num%3==0:num=num/3while num%5==0:num=num/5if num==1:return Truereturn False#运行超时'''#用堆heap,参考https://www.jiuzhang.com/solution/ugly-number-ii/#tag-highlight-lang-pythonimport heapqheap = [1]visited = set([1])val = Nonefor i in range(n):val = heapq.heappop(heap)for multi in [2,3,5]:if val*multi not in visited:visited.add(val*multi)heapq.heappush(heap,val*multi)return val
思路:
用堆来存储丑数,初始堆中只有一个1个丑数1,然后循环n次,每次从堆中取出一个丑数(堆顶上的值),用这个值分别乘以2,3,5,并将结果压到堆中,直到遍历到第n次,从堆中弹出的堆顶的值就是第n个丑数。同时将一个集合作为中间件,比较好判断乘的结果存不存在堆中。
注:堆又被称为优先队列,但队列中出队列是按照进队列的先后顺序取出元素,而堆是元素的优先级取出元素。堆的主要操作是插入和删除最小元素(元素值本身为优先级键值,小元素享有高优先级)。
丑数(输出第n个丑数)相关推荐
- 八进制数输出二进制c语言,C语言 某数输出二进制的某位
如题: 输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位). **输入格式要求:"%d" 提示信息:"请输入一个整数:" **输出格式 ...
- 将十进制数对应的八进制、十六进制、十进制数输出
题目描述 输入一个十进制数,转换为对应的八进制.十六进制.十进制数输出 输入 输入一个十进制数 输出 输出该十进制数对应的八进制.十六进制.十进制数 样例输入 10 样例输出 oct:12 hex:a ...
- 丑数_题目1214:丑数
//思路确实很巧,一般情况下很难想出来 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求 ...
- ACMNO.3 有三个整数a b c,由键盘输入,输出其中的最大的数。 输入 一行数组,分别为a b c 输出 a b c其中最大的数 样例输入 10 20 30 样例输出 30
基于平台Dev-C++ 5.11 题目描述 有三个整数a b c,由键盘输入,输出其中的最大的数. 输入 一行数组,分别为a b c 输出 a b c其中最大的数 样例输入 10 20 30 样例输出 ...
- 键盘录入一个正整数,把它的各个位上的数字倒着排列形成一个新的整数并输出。 例如:12345 数出54321 78760 输出6787(0省去)
package com.coffn.demos; /*** 4.键盘录入一个正整数,把它的各个位上的数字倒着排列形成一个新的整数并输出.例如:12345 数出54321 78760 输出6787(0省 ...
- C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。
)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...
- python输出1000以内回文数_「答案」python每日一题20201108
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.用python输出1000以内的所有质数. #####方法一#####def isPrime(n): if n <=1: r ...
- 信息学奥赛一本通(1235:输出前k大的数)——堆排序
1235:输出前k大的数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 12715 通过数: 4043 [题目描述] 给定一个数组,统计前k大的数并且把这 ...
- 输出前k大的数(信息学奥赛一本通-T1235)
[题目描述] 给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小.n < 100000. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...
- 99乘法表 (输入一个数,以该数为行数输出乘法表)
<pre name="code" class="cpp">输入一个1~9的整数,输出该数之前的乘法表. 如:输入3,则输出为:1*1=11*2=2, ...
最新文章
- python文件和目录
- 谷歌、OpenAI 做了一个“魔性AI显微镜”,打算撬开人工智能黑箱
- Javascript:charCodeAt()方法及示例
- Go语言中的struct的初始化。
- 如何实现tm同时监控多个状态的改变_广电机房监控系统【斯必得智慧机房】
- Ubuntu下搭建Janus Server
- FCN Caffe:可视化featureMaps和Weights(C++)、获取FCN结果
- 一些常用正则表达式片段的分析
- WPF 代码设置NotifyIcon图标
- 【数码管识别】感兴趣区域提取和缩放的顺序问题
- matlab按图像边缘抠图_Ps最全十大抠图方法都在这,最后一种万能「值得收藏」...
- SSM物业管理系统毕业设计-附源码310928
- 智慧消防技术在安全管理中的应用
- mac os下可能是最好的豆瓣电台——diumoo
- css 加粗或斜体hover鼠标划过,导致异常闪动,整体宽度增加的解决办法
- 常用数字信号处理方法在matlab上的实现(目录和先导)
- SQL SERVER/ROW_NUMBER() OVER (ORDER BY id)高效分页
- 你想收到中国向世界发出的第一封电子邮件吗
- 4.2 Branching Strategies
- 计算机编程vb求最大公约数,VB求最大公约数的两个例子
热门文章
- android根据url加载图片路径,初学Android——通过URL加载图片
- 史上最小白之Bert详解
- Python的安装及环境配置
- 电脑开不了机计算机无法启动,电脑中毒了开不了机怎么回事_电脑中毒无法开机的解决步骤-win7之家...
- Python将两个列表合并成一个列表
- PS技能:人物带状穿插效果制作
- 单片机实例2——模拟开关灯(硬件电路图+汇编程序+C语言程序)
- 基于matlab振动信号处理,基于PC及MATLAB的振动信号处理的实现
- golang学习笔记-1
- 进程管理之进程优先级