• 事实上我们不需要每次都计算前面所有丑数乘以2,3,5的结果,然后再比较大小。因为在已存在的丑数中,一定存在某个数m2(在代码中用res[t2]表示,t2表示需要乘以2的丑数的位置),在它之前的所有数乘以2都小于已有丑数,
    而m2×2的结果一定大于最大的丑数,同理,也存在这样的数m3,m5,我们只需要标记这三个数即可。
class Solution:
    def GetUglyNumber_Solution(self, index):
        if index == 0:
            return 0
        res = [1]  # res用来存储丑数
        t2 = t3 = t5 = 0  # 标记位置
        for i in range(index - 1):
            min_num = min(res[t2] * 2, res[t3] * 3, res[t5] * 5)
            # 将res中的第0个元素1分别2,3,5,然后取最小的一个数2放到res中
            res.append(min_num)
            # 判断res中最大丑数前的丑数k乘以2,3,5是不是小于最大的丑数,
            # 小于则说明该丑数k已经乘过2或3,或5了,那么它的位置t就必须往后移一个
            if res[t2] * 2 <= min_num:
                t2 += 1
            if res[t3] * 3 <= min_num:
                t3 += 1
            if res[t5] * 5 <= min_num:
                t5 += 1
        return res[-1]
s = Solution()
print(s.GetUglyNumber_Solution(7))