1. 程式人生 > >【劍指Offer】33醜數

【劍指Offer】33醜數

題目描述

把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。

時間限制:1秒;空間限制:32768K;本題知識點:陣列

解題思路

用迴圈的思路很容易時間超出限制,可以這樣考慮:根據醜數的性質,任意兩個醜數相乘的結果還是醜數,任意大於1的醜數可以由一個醜數乘以2/3/5得到,如:

1*2=2,2*2=4,3*2=6,4*2=8……

1*3=3,2*3=6,3*3=9,4*3=12……

1*5=5,2*5=10,3*5=15,4*5=20……

可以分三組資料來考慮,並用三個索引值i1/i2/i3記錄當前的醜數可由2/3/5哪個數計算出。每次迴圈只需要計算三次乘法的結果比較並記錄最小值,然後更新索引值i,這樣就能按從小到大的順序得到醜數陣列。

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        if index==0:
            return 0
        l = [1] #醜數陣列
        i1,i2,i3 = 0,0,0 #索引值
        while len(l)<index:
            num1 = l[i1] * 2
            num2 = l[i2] * 3
            num3 = l[i3] * 5
            num = min(num1, num2, num3)
            l.append(num)
            if num == num1:
                i1 += 1
            if num == num2:
                i2 += 1
            if num == num3:
                i3 += 1
        return l[-1]