题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
- 只包含质因子2,3,5的数为丑数,如8=2 * 2 * 2,2属于[2,3,5]之中的数,而14=2 * 7, 7不在[2,3,5]中,所以不是丑数
- 如果维护三个list,分别是乘2得到的丑数,乘3得到的丑数,乘5得到的丑数,但这样复杂度较高,而且会得到重复的丑数。
- 通过用指针求解的方法,定义三个指针,通过指针移动去分别乘以2,3,5可以避免重复计算。
- 通俗理解就是,原来有数组[1],将其分别乘以2,3,5,取最小的数即为2,通过判断可知丑数2为1 * 2,已经计算过了,所以将数字2的指针p2加1,避免在下一个循环又要在计算一次1*2结果,而是直接用res[1]*2,以此类推
class Solution:
def GetUglyNumber_Solution(self, index):
# write code here
if index == 0:
return 0
res=[1]
p2=0
p3=0
p5=0
for i in range(index - 1):
num=min(res[p2] * 2, res[p3] * 3, res[p5] * 5)
res.append(num)
if num % 2 == 0:
p2+=1
if num % 3 == 0:
p3+=1
if num % 5 == 0:
p5+=1
return res[-1]