给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
步骤一、确定状态:
确定dp数组及初始化含义
dp用的是一维数组,长度是n
dp[i]:第i个丑数
步骤二、推断状态方程:
dp[l2] * 2: l2表示的是i前面没乘过2的最小丑数的位置
dp[l3] * 3: l3表示的是i前面没乘过3的最小丑数的位置
dp[l5] * 5: l5表示的是i前面没乘过5的最小丑数的位置
当前的dp[i]也是选择3个方向的最小值: dp[i] = min(dp[l2]*2, dp[l3]*3, dp[l5]*5)
步骤三、规定初始条件:
初始条件:
全局初始化都是0, dp[0]=1, 也就是第一个丑数是1
步骤四、计算顺序:
从1开始正向遍历 先计算第1阶:dp[1] 计算第2阶:dp[2]
... 计算第最后一阶:dp[-1]
import heapq
class Solution:
def nthUglyNumber(self, n: int) -> int:
dp = [0] * n
dp[0] = 1
pos_2, pos_3, pos_5 = 0, 0, 0
for i in range(1, n):
dp[i] = min(dp[pos_2] * 2, dp[pos_3] * 3, dp[pos_5] * 5)
if dp[pos_2] * 2 == dp[i]:
pos_2 += 1
if dp[pos_3] * 3 == dp[i]:
pos_3 += 1
if dp[pos_5] * 5 == dp[i]:
pos_5 += 1
return dp[-1]