題目:把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
解法:我們從上面可以知道醜數的質因子只有2,3,5三個,我們如果要知道從小到大排列的第n個醜數,可以使用暴力破解的方法:即逐個判斷1,2,3,4,5,6,7,8,9.........等是不是醜數,直至找到第n個醜數為止,然後返回列印。但是暴力破解的方法的時間複雜度特別高。那麼怎麼降低時間複雜度呢?
我們先來看一下醜數的構成,即每乙個醜數都是之前的醜數*2或者*3或者*5,因此後面的醜數都是之前醜數的倍數。
第乙個醜數:1
第二個醜數是之前的醜數*2或*3或*5中最小的那個,即1*2,1*3,1*5中最小的,因此第二個醜數為2.
第二個醜數:2
第三個醜數是之前的醜數【1,2】*2或*3或*5中最小的那個,即1*2,1*3,1*5,2*2,2*3,2*5中比已經儲存的醜數大的同時在新產生的醜數中最小的,因此第三個醜數為3.(因為1*2為2,之前儲存的醜數中最大的是2,因此不選擇這個)
第三個醜數:3
以此類推。。。
第四個醜數:4
在知道醜數的構成原理以後我們就可以不用暴力窮舉到產生n個醜數了,我們可以通過之前的醜數來產生新的醜數,不過我們的代價是需要乙個n長的陣列儲存產生的醜數,從而方便新的醜數的生成,這種方法是空間換時間。
知道了原理以後我們的**就很簡單了,**如下所示:
class solution:
def getuglynumber_solution(self, index):#index為n
# write code here
if index == 0:
return 0
if index == 1:
return 1
n = 1
ugly = [1]
while n < index:#逐步產生n個醜數
l_old =
for i in ugly:
for j in [2,3,5]:
cur_max = max(ugly)#之前醜數中最大的醜數,我們新加的醜數必須大於之前已經儲存的最大的醜數
l_new = [x for x in l_old if x > cur_max]
n += 1
return ugly[index-1]#因為列表下表是從0開始的,所以第index個的下標是index-1
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...
劍指Offer 醜數
我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...