[剑指Offer]丑数[Python]

题目要求:把只包含因子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]

猜你喜欢

转载自blog.csdn.net/jillian_sea/article/details/80380275