题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路:我们可以维护三个list,分别是乘2得到的丑数,乘3得到的丑数,乘5得到的丑数,但这样复杂度较高,而且会得到重复的丑数。实际上每次我们只用比较3个数:用于乘2的最小的数、用于乘3的最小的数,用于乘5的最小的数。这样只需要维护三个指针,而不用维护三个数组。

def GetUglyNumber_Solution(self, index):
    # write code here
    if index <= 0:
        return 0
    uglyList = [1]
    p2 = 0 # p2指向小于newUgly且最大的乘以2后可能成为下一个丑数的丑数
    p3 = 0 # p3指向小于newUgly且最大的乘以3后可能成为下一个丑数的丑数
    p5 = 0 # p5指向小于newUgly且最大的乘以5后可能成为下一个丑数的丑数
    for i in range(index-1):
        newUgly = min(uglyList[p2]*2, uglyList[p3]*3, uglyList[p5]*5)
        uglyList.append(newUgly)
        if (newUgly % 2 == 0):
            p2 += 1
        if (newUgly % 3 == 0):
            p3 += 1
        if (newUgly % 5 == 0):
            p5 += 1
    return uglyList[-1]