[剑指 Offer 49. 丑数] | 刷题打卡

333 阅读1分钟

题目描述

  • 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
  • 示例:
  输入: n = 10
  输出: 12
  解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
  • 说明:  
  1 是丑数。
  n 不超过1690。

思路分析

首轮思路

  • n2、n3、n5分别代表三种类型的丑数
  • 边界判断:1 属于丑数
  • 通用判断:分别获取 n2、n3、n5所有丑数,去重后排序取 n-1 索引位置
  n2:1*2,2*2,3*2,4*2,5*2,... ,n*2
  n3:1*3,2*3,3*3,4*3,5*3,... ,n*3
  n5:1*5,2*5,3*5,4*5,5*5,... ,n*5
  • 错误纠正
  1.性能不通过
  2.产生错误丑数,如:n * 7

思路优化

  • 三指针策略优化:a、b、c分别代表 n2、n3、n5的指针
  • 性能优化:min(n2, n3, n5)

代码

# Python
class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1: return 1
        dp, a, b, c = [1] * n , 0, 0 , 0
        for i in range(1, n):
            n2, n3, n5 = dp[a] * 2, dp[b] * 3, dp[c] * 5
            dp[i] = min(n2, n3, n5)
            if dp[i] == n2:
                a += 1
            if dp[i] == n3:
                b += 1
            if dp[i] == n5:
                c += 1
        return dp[-1]

总结

  • 边界处理
  • 丑数来自于基础丑数[2, 3, 5] * n,注意排序处理

附录

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情