第一眼知道是dp问题,但是理不清思路,发现dp问题的核心和难点在于抽象出最终最优解与子最优解之间的关系函数。此题中,需要用opt[n-1]…opt[1]来求opt[n], 但是1~n-1每个数都有*2,*3,5 三种可能作为opt[n]的可能解,过于复杂。看了解题思路很受启发,只需要从第一个数1开始,用三个index控制2, *3, *5的数的位置。下一个丑数就是这三个index对应的值的最小那个,然后把对应的index向右移动一位,循环此策略:
class Solution(object):
def nthUglyNumber(self, n):
"""
:type n: int
:rtype: int
"""
ind_2, ind_3, ind_5 = 0, 0, 0
ugly = n*[1]
for i in range(1,n):
ugly[i] = min(ugly[ind_2]*2, ugly[ind_3]*3, ugly[ind_5]*5)
if ugly[i] == ugly[ind_2]*2: ind_2+=1
if ugly[i] == ugly[ind_3]*3: ind_3+=1
if ugly[i] == ugly[ind_5]*5: ind_5+=1
return ugly[n-1]