百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

曾经绊倒我的“超级丑数”

toyiye 2024-06-21 12:02 13 浏览 0 评论


既然来了,何不认真读完此文呢?每天多花20分钟,做一些别人不愿做的事,坚持下去,会有一个结果的。废话不多说,抓紧看文章,本文共包括如下知识:

  1. 学会列表和排序很难求解的场景
  2. 学会使用堆的场景
  3. 学会一个使用堆的案例
  4. 进一步提高对内置模块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).

今天就写到这里,如果对你有用,记得点赞鼓励哈 感谢!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码