题目:只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
思路:动态规划 可以先举例子分析
复杂度:时间复杂度 O(n) 空间复杂度 O(n)
PS: 质因子(质因数):指能整除给定正整数的质数。如:360 = 2*2*2*3*3*5 =2^3*3^2*5 其质因子为2 3 5
'''
题目:只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
思路:
新的丑数 = 丑数 * 因子 (当按顺序时 要保证min(丑数*因子))
已知第一个丑数为 1 ,求第2个丑数
x_2 = min(x_a*2,x_b*3,x_c*5)=min(2,3,5) a,b,c∈[1] a=1,b=1,c=1 得x_2 = 2 #当2放进去后 a变为2
已知一个丑数序列为 1 2 ,求第3个丑数
x_3 = min(x_a*2,x_b*3,x_c*5)=min(4,3,5) a,b,c∈[1,2] a=2,b=1,c=1 得x_3 = 3 #当3放进去后 b变为2
已知一个丑数序列为 1 2 3 ,求第4个丑数
x_3 = min(x_a*2,x_b*3,x_c*5)=min(4,6,5) a,b,c∈[1,3] a=2,b=2,c=1 得x_3 = 4 #当4放进去后 a变为3
…………………………
故:可以考虑使用动态规划
dp[i]表示丑数序列中的第i个元素
状态转移方程: x_i = min(x_a*2,x_b*3,x_c*5) a,b,c∈[1,i] 当min=x_j 时, j+1
复杂度: 时间复杂度 O(n) 空间复杂度 O(n)
'''
def nthUglyNumber(n):
dp = [0] * (n+1)
dp[1] = 1
fa, fb, fc, a, b, c = 2, 3, 5, 1, 1, 1
for i in range(2, n+1):
tempa, tempb, tempc = dp[a] * fa, dp[b] * fb, dp[c] * fc
dp[i] = min(tempa, tempb, tempc)
if dp[i] == tempa:
a += 1
if dp[i] == tempb:
b += 1
if dp[i] == tempc:
c += 1
return dp[n]