題目描述:
把只包含質因子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...