前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【一天一道Leetcode】丑数Ⅱ

【一天一道Leetcode】丑数Ⅱ

作者头像
潘永斌
发布2021-04-20 15:57:44
2700
发布2021-04-20 15:57:44
举报
文章被收录于专栏:看那个码农看那个码农

01

题目描述

题目描述:

给你一个整数n,请你找出并返回第n个丑数。

丑数就是只包含质因数 2、3、5的正整数。

示例 1:

代码语言:javascript
复制
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 
是由前 10 个丑数组成的序列。

示例 2:

代码语言:javascript
复制
输入:n = 1
输出:1
解释:1 通常被视为丑数。

提示:

1 <= n <= 1690

02

思路和方法

根据题目中丑数的定义,0和负整数一定不是整数。

1是第一个丑数。

我们通过题目中丑数的定义,丑数就是只包含质因数 2、3、5的正整数。

我们可以依次算出所有丑数,直到算到所需的第n个丑数,进行输出为止。

如何计算?

我们可以根据丑数的性质,只包含2,3,5三个质因数。我们可以分别设置三个指针用来计算丑数。

再设置一个数组用于存储从小到大遍历到的丑数。

最后返回数组中的第n个元素即可。

我们的代码输出为:

代码语言:javascript
复制
class Solution:
    def nthUglyNumber(self, n: int) -> int:
        if n<=0:
            return false

        # 放进第一个丑数:1
        nums = [1]

        # 三个指针初始化
        i2 = 0 
        i3 = 0
        i5 = 0

        # 算出所有丑数,直到所需的第n个为止
        for i in range(1,n):

            # 从小到大,按照丑数定义收集丑数
            ugly = min(nums[i2] * 2,nums[i3] * 3,nums[i5] * 5) 
    
            # 将丑数放进结果数组中
            nums.append(ugly) 

            # 指针移动,从小到大地寻找丑数
            if(nums[i] == nums[i2] * 2): i2 += 1 
            if(nums[i] == nums[i3] * 3): i3 += 1
            if(nums[i] == nums[i5] * 5): i5 += 1

        # 返回第n个丑数
        return nums[n-1]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 看那个码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01
  • 02
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档