《劍指offer》 醜數 (python版)

2021-08-21 11:43:53 字數 1317 閱讀 5094

題目描述:

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

思路:

最直接的暴力解法是從1開始依次判斷數字是否為醜數,直到達到要求的醜數個數。當然這種方法肯定是會tle的,所以我們分析一下醜數的生成特點(這裡把1排除):

因為醜數隻包含質因子2,3,5,假設我們已經有n-1個醜數,按照順序排列,且第n-1的醜數為m。那麼第n個醜數一定是由這n-1個醜數分別乘以2,3,5,得到的所有大於m的結果中,最小的那個數。

事實上我們不需要每次都計算前面所有醜數乘以2,3,5的結果,然後再比較大小。因為在已存在的醜數中,一定存在某個數t2

t

2,在它之前的所有數乘以2都小於已有醜數,而t2

×2t 2×

2的結果一定大於m,同理,也存在這樣的數t3

,t5 t3,

t5

,我們只需要標記這三個數即可。

# -*- coding:utf-8 -*-

class

solution:

defgetuglynumber_solution

(self, index):

# write code here

if index == 0:

return

0# 1作為特殊數直接儲存

baselist = [1]

min2 = min3 = min5 = 0

curnum = 1

while curnum < index:

minnum = min(baselist[min2] * 2, baselist[min3] * 3, baselist[min5] * 5)

# 找到第乙個乘以2的結果大於當前最大醜數m的數字,也就是t2

while baselist[min2] * 2

<= minnum:

min2 += 1

# 找到第乙個乘以3的結果大於當前最大醜數m的數字,也就是t3

while baselist[min3] * 3

<= minnum:

min3 += 1

# 找到第乙個乘以5的結果大於當前最大醜數m的數字,也就是t5

while baselist[min5] * 5

<= minnum:

min5 += 1

curnum += 1

return baselist[-1]

python 醜數 劍指offer

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 最直接的暴力解法是從1開始依次判斷數字是否為醜數,直到達到要求的醜數個數。當然這種方法肯定是會tle的,所以我們分析...

劍指offer 醜數 python

題目 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。class solution def getuglynumber solution self,index write...

劍指offer 醜數 (Python)

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。題目鏈結 因為新增的大的醜數一定小的醜數乘以2,3,5得到的值最小的乙個。coding utf 8 class solut...