点击

蓝色字体

关注,欢迎星标此号

既然来了,何不认真读完此文呢?每天多花20分钟,做一些别人不愿做的事,坚持下去,会有一个结果的。废话少说,通过此文,你将会学到如下知识:

学会列表和排序很难求解的场景

学会使用堆的场景

学会一个使用堆的案例

进一步提高对内置模块heapq的使用能力

1 超级抽数

题目来自 https://leetcode-cn.com/problems/super-ugly-number/,阿里面试曾考过此题,大家务必重视此题。

首先要理解题目,我做此题时,读题好几遍,才完全明白超级丑数的定义。

给定一个质数列表primes,如果一个数的所有质数构成的列表是primes的子集,则此数为超级丑数。

因此,超级抽数依赖于给定的primes,要求求出第n个丑数。

示例

输入: n = 12, primes = [2,7,13,19]

输出: 32

解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。

列表和排序很难求解

先从暴力枚举开始分析,假定primes等于[2,5,13],依次列举出所有可能的丑数:1, 2, 4, 8, 16, 32, …. 糟糕!因为仅仅使用一个素数2,就能列举出很多。幸好此题限定一个丑数的上限,在32位有符整数范围内(最大值为:),即便如此,穷举的情况依然非常复杂,更别提求解第n个丑数了!

的确,此题不太容易确定所有的丑数序列,完整的序列无法确定,排序也就无从谈起。因此,通过从小到大排序后找出第n个丑数的方法就不可行。

经验:对于无法提前预知整个列表,或者构建出整个序列耗费时间较长,或占用内存过大时,求第n个丑数,往往不太适合使用列表!

使用堆的场景

考虑使用堆,对应Python中heapq模块,它专治以上三种情况发生时,求解第n个丑数。

这道题使用heapq的求解思路如下:

step1 构建heapq,装入第一个元素,即素数1;

step2 移出heapq的根元素ugly,遍历primes拿出prime,同时与prime的元素相乘,得到一个新的丑数,并装入到heapq中。备注:Python中heapq是一个小根堆,也叫做优先级队列,在装入heapq中时,对象内部总会维护一个小根堆,所以每次pop时,都是当前heapq的最小值。

step3 利用上述特性,当移出n个元素时,实际上相当于从已排序好的列表中找到其第n个小的元素,这不就是丑数列表排序好后,第n个丑数吗!正是想要的结果第n个丑数。

需要注意,丑数装入heapq时,不能出现重复。解决起来也很方便,使用集合set防止重复添加。

代码

将上述思路兑现为代码:

class Solution(object):

def nthSuperUglyNumber(self, n, primes):

"""

:type n: int

:type primes: List[int]

:rtype: int

"""

nums, i, s = [], 0, set()

heapify(nums)

heappush(nums, 1) # step1

ugly = 0

for _ in range(n): # step2

ugly = heappop(nums)

for prime in primes:

uglyCombine = ugly * prime

if uglyCombine not in s: # step3

s.add(uglyCombine)

heappush(nums, uglyCombine)

return ugly

时间复杂度等于 O(knlogn),k为primes长度,n为第几个丑数; 空间复杂度为O(n).

每天下班9点多到家,然后电脑前一顿狂刷,已快3年,有苦有甜,更多是一种习惯。留言告诉我,你大概什么时候关注我的,有没有一直关注我快3年的铁粉,有奖品要发。

看完这篇不过瘾,关注刷题日记,立即领取665题分析.pdf:

长按关注,领取665题.pdf

php实现丑数,曾经绊倒我的 “超级丑数”相关推荐

  1. Leetcode 313. 超级丑数 解题思路及C++实现

    解题思路: 与Leetcode 264. 丑数 II的解题思路一样,均使用最小堆来存储丑数,第i次更新最小堆时,得到第i大的丑数. 可结合Leetcode 264. 丑数 II的解题思路理解:http ...

  2. 从C语言的角度重构数据结构系列(八)-数据结构堆知识超级丑数

    前言 在这里给自己打个广告,需要的小伙伴请自行订阅. python快速学习实战应用系列课程 https://blog.csdn.net/wenyusuran/category_2239261.html ...

  3. LeetCode 313. 超级丑数(动态规划)

    1. 题目 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7,13,1 ...

  4. 【数学】丑数II 和 超级丑数

    题目描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 提示:1也是丑数 示例 1: 输入:n = 9 输出:10 解释:[1, 2, ...

  5. NAT技术解决了IPv4地址短缺的问题,假设内网的地址数是m,而外网地址数n,若mn,则这种技术叫做(66),若mn,且n=1,则这种技术这叫做(67)。【答案】A C

    NAT技术解决了IPv4地址短缺的问题,假设内网的地址数是m,而外网地址数n,若m>n,则这种技术叫做(66),若m>n,且n=1,则这种技术这叫做(67). (66)A.动态地址翻译 B ...

  6. 函数字节不对齐函数崩溃_Excel中统计字符数,不需要一个一个的数,len函数能轻松搞定...

    简介:要统计Excel单元格中的字符数,不需要一个一个的数,利用len函数就能轻松搞定. 问:什么是len函数? 答:自动统计字符数的函数 问:怎样记住len函数 答:len是length(长度)的简 ...

  7. 寻找阿姆斯特朗数c语言程序,C程序检查阿姆斯特朗数

    C程序检查阿姆斯特朗数 在此示例中,您将学习检查用户输入的整数是否是Armstrong数字. 要理解此示例,您应该了解以下C语言编程主题: 如果满足以下条件,则一个正整数称为阿姆斯特朗数(n阶),如果 ...

  8. 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。...

    题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 思路:使用一个方法来判断这个数是否为回文数 打印出[10000,99999]之间所有的回文数 public ...

  9. 计算机二进制基础列式,计算机基础;十进制数100对应的二进制数、八进制数和十六进制数分别是...

    中计数采用了多种记数制,比如:十进制,六十进制(六十秒为一分,六十分为一小时,即基数为60,运算规则是逢六十进一),--.在计算机中常用到十进制数.二进制数.八进制数.十六进制数等,下面就这几种在计算 ...

最新文章

  1. PXE自动化装机(4)
  2. python遍历字典的四种方法
  3. iOS - AsyncSocket 的使用
  4. java抓取图片_java 抓取网页的图片
  5. 计算机网络【二】物理层基础知识
  6. PTS 有奖征稿活动官方示例
  7. Kudu : kudu 主键相关
  8. 【学习笔记】计算机导论之计算机软件
  9. 手把手教你训练一个秒杀科比的投篮AI,不服来练 | 附开源代码
  10. SQL允许你用EXECUTE执行一个变量中定义的SQL语句,并且允许你在被执行的SQL语句中,再次嵌套入一个变量定义的语句,并且再次在其中用EXECUTE执行它...
  11. php如何实现文件操作,php实现操作文件的各种方式总结(附代码)
  12. 关于目前深度学习技术的相关思考----个人理解笔记
  13. C/C++[1782 codeup] 谁是你的潜在朋友
  14. 怎么在html中加入特效汉字,如何在小视频上加文字,文字动画特效,朋友圈小视频加文字...
  15. 32形容词/副词的原级比较
  16. 笔记本键盘失灵解决办法
  17. (仿微信Android)IM聊天+抢红包+直播+朋友圈源码发布了
  18. 用数据激活线下,更好玩的新营销来了
  19. 高德地图 scale
  20. 关于Java中的finalize方法

热门文章

  1. 手机设备管理平台OpenSTF:002手机远程连接
  2. 回馈父母,该给老年人买什么保险?
  3. 搜索不到投屏设备怎么办_手机投屏找不到电视设备怎么办_手机投屏检测不到设备的处理方法-系统城...
  4. Vue.js:todomvc经典案例详解
  5. 使用cmd运行java出现错误:编码GBK 的不可映射字符
  6. fit、transform、fit_transform的区别和联系
  7. 二进制补码记数法和余码记数法
  8. Django创建超级用户(超级管理)
  9. 计算思维就是使用计算机程序,什么是计算思维+计算思维的含义
  10. 14(高级)CSS动画之:旋转星球