https://leetcode.com/problems/ugly-number-ii/
understanding:
丑陋数序列可以拆分为下面3个子列表:
我们可以发现每一个子列表都是丑陋数本身(1, 2, 3, 4, 5, …) ,乘以 2, 3, 5。注意这里不是所有自然数,而是丑陋数本身
接下来我们使用与归并排序相似的合并方法,从3个子列表中获取丑陋数。每一步我们从中选出最小的一个,然后向后移动一步。
这里可以用3个pointers,生成完第n个最大值的时候,对应的pointer就往前走一步。那么就可以控制搜索范围。
参考:http://bookshadow.com/weblog/2015/08/19/leetcode-ugly-number-ii/
code:
class Solution(object):
def nthUglyNumber(self, n):
"""
:type n: int
:rtype: int
"""
p = [1]
k2 = k3 = k5 = 0
while len(p) < n:
a, b, c = [p[k2]*2, p[k3]*3, p[k5]*5]#p[k2]负责生成乘以2的新ugly number,<span style="font-family: Arial, Helvetica, sans-serif;">p[k3]负责生成乘以3的新ugly number,</span>
m = min([a,b,c])
if m == a:
k2 += 1
if m == b:
k3 += 1
if m == c:
k5 += 1
p.append(m)
return p[n-1]