把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
定義遞迴函式,該遞迴函式用於求解當前數是否是醜數。採用迭代將每個數傳入遞迴函式判斷是否是醜數,若是醜數,返回true,醜數列表新增該數進列表,否則進入下乙個數迭代求解,直到醜數列表的的長度等於n,返回醜數列表的第n-1個位置的數即可
**實現
class solution1:
def getuglynumber_solution(self, index):
par = [1, 2, 3, 4, 5]
if index < 6:
return par[index - 1]
count = 6
while true:
if index == len(par):
return par[index-1]
else:
if self.dfs(count):
count += 1
def dfs(self, cur):
# 如果當前的數在2.0,3.0,5.0的集合中,則代表傳入遞迴函式的初始數是醜數。
if cur in [2.0, 3.0, 5.0]:
return true
# 如果當前數小於2.0,則代表傳入遞迴函式的初始數不是醜數
if cur < 2.0:
return false
# 遞迴除2,3,5,返回三者或結果即可得知值該數是否是醜數
return self.dfs(float(cur) / 2) or self.dfs(float(cur)/3) or self.dfs(float(cur)/5)
當然,不難看出,該實現方法的複雜度不是一般的小,要在指定時間通過牛客所有測試用例是不可能的,所以可使用以下方法:
由題意可知:後面的醜數一定是由前面的醜數乘以2、3或5得到,需要新增其中最小數,
則可定義三個引數,t1,t2,t3,這三個引數都初始化為0,代表相應將要和2, 3,5相乘的數在醜數列表中的索引,每次醜數列表新增其三者最小的乙個,然後將相應的索引加1進入下一輪醜數新增,直到醜數列表的長度為n,返回醜數列表的最後乙個元素即可。
**實現
class solution:
def getuglynumber_solution(self, index):
if index <= 0:
return 0
res = [1]
t1,t2,t3 = 0,0,0
while len(res) < index:
# 新增最小當前最小的醜數
# 判斷新增的醜數具體是由哪些數相乘而得,將相應的索引加1,進入下一輪最小丑數的新增
if res[-1] == 2*res[t1]:
t1 += 1
if res[-1] == 3*res[t2]:
t2 += 1
if res[-1] == 5*res[t3]:
t3 += 1
return res[-1]
劍指Offer 醜數(動態規劃求解) (三十三)
題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。醜數定義。實現思路 常規窮舉 乙個數如果分別整除2,3,5後,得到1,那麼這個數是醜數,時間複雜度為o n 另外...
劍指offer三十三 第n個醜數
前言 本文只提供了解題的思路,只有想法二的,但想法二不是最優解。如果你想找乙個最好答案,可能本文不合適。如果你想一步一步接近最優答案的話,可以耐心看完。把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求...
牛客 劍指offer 醜數(Java)
牛客上對應題目 解析 方法一 逐個判斷每個整數是不是醜數的解法,直觀但不夠高效 所謂乙個數m是另乙個數n的因子,是指n能被m整除,也就是說n m 0.根據醜數的定義,醜數只能被2,3,5整除。也就是說如果乙個數能被2整除,我們把它連續除以2 如果能被3整除,就連續除以3 如果能被5整除,就除以5.如...