《剑指offer》丑数(python)

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

解题思路

思路1:

因为只包含质因子2、3和5,那就让每个数都循环除以2、3和5,如果最后得到1,那么说明是丑数。

但是该算法时间太长,不能在规定时间内完成,牛客网不通过!

参考https://blog.csdn.net/waterkong/article/details/78154611

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        if index==0 or index==1:
            return index
        res=[]
        i = 2
        count = 0
        while True:
            temp = i
            while temp%2 == 0:
                temp = temp//2
            while temp%3 == 0:
                temp = temp//3
            while temp%5 == 0:
                temp = temp//5
            if temp == 1:
                res.append(i)
                count += 1
            if count >= index:
                break
            i+=1
        return res[-1]

        
        

思路2:

因为丑数只包含质因子2,3,5,假设我们已经有n个丑数,按照顺序排列,且第n的丑数为M。那么第n+1个丑数一定是由这n个丑数分别乘以2,3,5,得到的所有大于M的结果中,最小的那个数。

事实上我们不需要每次都计算前面所有丑数乘以2,3,5的结果,然后再比较大小。因为在已存在的丑数中,一定存在某个数m2(在代码中用res[t2]表示,t2表示需要乘以2的丑数的位置),在它之前的所有数乘以2都小于已有丑数,而m2×2的结果一定大于最大的丑数,同理,也存在这样的数m3,m5,我们只需要标记这三个数即可。

参考:https://blog.csdn.net/qq_20141867/article/details/81060581

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        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=t2+1
            if res[t3]*3<=min_num:
                t3=t3+1
            if res[t5]*5<=min_num:
                t5=t5+1
        return res[-1]

 

你可能感兴趣的:(剑指offer编程)