思路:
通俗易懂的解释:
首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三个丑数出发乘以2,3,5就得到4,6,10,6,9,15,10,15,25九个丑数,我们发现这种方法会得到重复的丑数,而且我们题目要求第N个丑数,这样的方法得到的丑数也是无序的。
indexTwo=0,indexThree=0,indexFive=0
(1)丑数数组: 1
乘以2的新丑数:2
乘以3的新丑数:3
乘以5的新丑数:5
选择三个新丑数最小的2加入丑数数组,indexTwo=1
(2)丑数数组:1,2
乘以2的新丑数:4
乘以3的新丑数:3
乘以5的新丑数:5
选择三个新丑数最小的数3加入丑数数组,indexThree=1
(3)丑数数组:1,2,3
乘以2的队列:4
乘以3的队列:6
乘以5的队列:5
选择三个新丑数最小的数4加入丑数数组,indexTwo=2
(4)丑数数组:1,2,3,4
乘以2的队列:6
乘以3的队列:6
乘以5的队列:5
选择三个新丑数最小的数5加入丑数数组,indexFive=1
(5)丑数数组:1,2,3,4,5
乘以2的队列:6
乘以3的队列:6
乘以5的队列:10
依次类推
# -*- coding:utf-8 -*-
class Solution:
def GetUglyNumber_Solution(self, index):
if (index <= 0):
return 0
uglyList = [1]
indexTwo = 0
indexThree = 0
indexFive = 0
for i in range(index-1):
newUgly = min(uglyList[indexTwo]*2, uglyList[indexThree]*3, uglyList[indexFive]*5)
uglyList.append(newUgly)
if (newUgly % 2 == 0):
indexTwo += 1
if (newUgly % 3 == 0):
indexThree += 1
if (newUgly % 5 == 0):
indexFive += 1
return uglyList[-1]
大佬的思想真的很棒。