【劍指Offer】33醜數
阿新 • • 發佈:2018-12-16
題目描述
把只包含質因子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]