题目要求:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:我的解题思路是从1往后遍历把所有的丑数都找出来,在根据索引找出最后的结果,但事实证明时间复杂度太高了,所以去看了大家的答案.有的人讲的很明白,有一个用c++写的答案很明白,所以就把它变成了python,如下所示:
思路:
链接:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b
来源:牛客网
所有的丑数分为三种类型 2*i,3*i,5*i 其中 i是数组中的元素,一开始只有1
2*1 3*1 5*1
#2,3,5分别跟现有的丑数1相乘(1的索引是0),找出最小的数加入丑数队列.因为新加的丑数2=2*1,意味着2*1这个数已经很小了,就不用再参加下一次的比较了,则让2*2加入比较,(2*的索引+1)
2*2
3*1 5*1
# 2,3,5乘的丑数的索引为1,0,0,重复上述操作,新加入丑数3=3*1,意味着3*1这个数已经很小了,就不用再参加下一次的比较了,则让3*2加入比较,(3*的索引+1)
2*2 3*2 5*1 #2,3,5乘的丑数的索引为1,1,0,重复上述操作,新加入丑数4=2*2,意味着2*2这个数已经很小了,就不用再参加下一次的比较了,则让2*3加入比较,(2*的索引+1)
2*3 3*2 5*1 #2,3,5乘的丑数的索引为2,1,0,重复上述操作,新加入丑数5=5*1,意味着5*1这个数已经很小了,就不用再参加下一次的比较了,则让5*2加入比较,(5*的索引+1)
2*3 3*2 5*2 #2,3,5乘的丑数的索引为2,1,1,重复上述操作,新加入丑数6=2*3=3*2,意味着2*3这个数已经很小了,就不用再参加下一次的比较了,则让2*4,3*3加入比较,(2*的索引+1,3*的索引加1)
2*4 3*3 5*2 #...
2*5 3*3 5*2
2*5 3*4 5*2
2*6 3*4 5*3
2*8 3*5 5*3
2*8 3*6 5*4
# -*- coding:utf-8 -*-
class Solution:def GetUglyNumber_Solution(self, index):
# write code here
if index <=0:
return 0
ans = [1]
i2,i3,i5 = 0,0,0
i = 1
while len(ans)<index:
ans.append(min(ans[i2]*2,min(ans[i3]*3,ans[i5]*5)))
if ans[i] == ans[i2]*2: #要分别比较,不能直接用elif ,这样的话有一些相同的值会重复比较
i2 +=1
if ans[i] == ans[i3]*3:
i3 +=1
if ans[i] == ans[i5]*5:
i5 +=1
i +=1
return ans[i-1]