牛客劍指offer第三十三題(醜數)

2021-09-27 08:28:45 字數 1633 閱讀 6739

把只包含質因子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.如...