ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 264. 丑数 II

2021-04-10 16:33:34  阅读:231  来源: 互联网

标签:丑数 12 10 res 乘以 II 263 LeetCode


264. 丑数 II

Difficulty: 中等

编写一个程序,找出第 n 个丑数。

丑数就是质因数只包含 2, 3, 5正整数

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

**说明: **

  1. 1 是丑数。
  2. n 不超过1690。

Solution

本题是263题的延伸题目,把263题的解题思路拿过来,逐个判断每个整数是不是丑数是一种方法,不过效率不高,因为不管是不是丑数都要去验证一遍,比如示例中找出第10个丑数需要验证12次。

因为丑数的质因数只有2/3/5,根据定义,所有的丑数应该是另一个丑数乘以2、3或者5的结果,如果我们提前把丑数计算好并按大小次序放进数组,根据已有的丑数得到后续的丑数就方便多了。

1 是默认已知的丑数U,后面的丑数是前面丑数1乘以2、3或者5的结果,此时的3个结果我们只需要取第一个大于丑数U的结果2作为第二个丑数,至于其他的结果以后再说。

另外需要注意的点是我们没有必要把已有所有的丑数全部都乘以2、3或者5,因为接下来的一个丑数必然是由最接近它(刚好不超过)的丑数乘以2、3或者5得到的,所以每次记住最接近丑数的2/3/5乘数结果位置就可以了。

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        res = [1]
        nextIdx, idx2, idx3, idx5 = 1, 0, 0, 0
        while nextIdx < n:
            uglyNum = min(res[idx2] * 2, res[idx3] * 3, res[idx5] * 5)
            res.append(uglyNum)
            while res[idx2] * 2 <= res[nextIdx]:
                idx2 += 1
            while res[idx3] * 3 <= res[nextIdx]:
                idx3 += 1
            while res[idx5] * 5 <= res[nextIdx]:
                idx5 += 1
            nextIdx += 1
        return res[nextIdx-1]

相关题目:

  1. LeetCode 263. 丑数 - swordspoet - 博客园

标签:丑数,12,10,res,乘以,II,263,LeetCode
来源: https://www.cnblogs.com/swordspoet/p/14641203.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有