資料結構與演算法(31) 醜數

2021-10-22 15:20:29 字數 979 閱讀 8743

劍指 offer 49. 醜數

我們把只包含質因子 2、3 和 5 的數稱作醜數(ugly number)。求按從小到大的順序的第 n 個醜數。

我們知道,醜數的排列肯定是1,2,3,4,5,6,8,10… 然後有乙個特點是,任意乙個醜數都是由小於它的某乙個醜數2,3或者5得到的,那麼如何得到所有醜數呢? 現在假設有3個陣列,分別是: a:

b:c:

那麼所有醜數的排列,必定就是上面abc3個陣列的合併結果然後去重得到的,那麼這不就轉換成了三個有序陣列的無重複元素合併的問題了嗎?而這三個陣列就剛好是乘以2,3,5得到的。

合併有序陣列的乙個比較好的方法,就是每個陣列都對應乙個指標,然後比較這些指標所指的數中哪個最小,就將這個數放到結果陣列中,然後該指標向後挪一位。

回到本題,要求醜數ugly陣列中的第n項,而目前只知道ugly[0]=1,所以此時三個有序鍊錶分別就只有乙個元素:

a :

b :

c :假設三個陣列的指標分別是i,j,k,此時均是指向第乙個元素,然後比較a[i],b[j]和c[k],得到的最小的數a[i],就是ugly[1],此時ugly就變成了,對應的abc陣列就分別變成了:

a :

b :

c :此時根據合併有序陣列的原理,a陣列指標i就指向了下乙個元素,即』2*2』,而j和k依然分別指向b[0]和c[0],然後進行下一輪合併,就是a[1]和b[0]和c[0]比較,最小值作為ugly[2]…如此迴圈n次,就可以得到ugly[n]了。

此外,注意到abc三個陣列實際上就是ugly*2,ugly*3和ugly*5的結果,所以每次只需要比較a[i]=ugly[i]*2,b[j]=ugly[j]*3和c[k]=ugly[k]*5的大小即可。然後誰最小,就把對應的指標往後移動乙個,為了去重,如果多個元素都是最小,那麼這多個指標都要往後移動乙個。

class

solution

return ugly[n-1]

;}}

演算法與資料結構實驗題 3 1 火車

實驗任務 tonyy 等火車無聊的時候,會去觀察火車的排列,有一天他思考這麼乙個問 題,火車總站的火車只能進站,要出站的話只能先出最後進站的那輛車,那麼知 道火車的進站順序,能不能把它的出站順序調整成火車站想要的呢?資料輸入 輸入第一行為乙個正整數 n 表示火車輛數 編號 1 n 1 n 9 然後為...

《資料結構與演算法之美》31 貪心演算法

貪心演算法 英語 greedy algorithm 又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。維基百科 貪心演算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會儲存以前的運算結果,並根據以...

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...