题目描述
- 我们把只包含质因子 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,注意排序处理
附录
- 原题链接:剑指 Offer 49. 丑数
- 参考题注:leetcode-cn.com/problems/ch…
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情