我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
说明: 1 是丑数;n 不超过1690。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
思路
最普通的想法时遍历n个数,找到符合要求的数
更好的思路是丑数都是2,3,5的倍数,直接找到他们。不对非丑数进行取余验证( 空间换时间):从小到大构建丑数集
class Solution:
def nthUglyNumber(self, n: int) -> int:
if n<1:
return 0
res=[1]
k2,k3,k5 = 0,0,0
for _ in range(1,n):
min_num = min(res[k2]*2,res[k3]*3,res[k5]*5)
res.append(min_num)
if min_num % 2 == 0:
k2 += 1
if min_num % 3 == 0:
k3 += 1
if min_num % 5 == 0:
k5 += 1
return res[-1]