求第N個醜數

2021-08-21 12:09:40 字數 971 閱讀 3370

原問題描述:

把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
這個題不是很難,基本上看完題就能想出解法,但是要想出時間複雜度為o(n)的解法還是有點難度的。我最開始的解法時間複雜度為o(nlgn),後來在網上看到更好的解法時間複雜度為o(n),感覺解法很好,因此在這裡分析一下。

我自己的解法就不貼上來了,這裡給出別人的解法:

int getuglynumber_solution(int

index)

return res[index-1];

}

時間複雜度:o(n)。

空間複雜度:o(n)。

演算法思想:位於後面的醜數必定是前面的醜數與2、3或5的乘積,因此要計算某個位置的醜數值,只要取前面某個位置的醜數與三個質因子的乘積最小值就可以了。

程式用vector來儲存前index個醜數(此解法很好的地方之一就是不做多餘的動作,從前往後逐個計算醜數,每次計算出的結果不會有非醜數的出現)。

id2、id3、id5三個變數用於儲存下標,什麼下標?由程式可知,對於i位置的醜數,其值等於res[id2]*2、res[id3]*3、res[id5]*5的最小值,可見,這三個變數就是讓i位置的醜數值最小的醜數的下標。

三個儲存下標的變數為何要加1?當某個位置的醜數與2、3和5之一的乘積確定了後面的乙個醜數後,相應質因子對應的變數肯定得加1了,不然後面會出現重複的醜數值。

注意:這裡迴圈中的三個if語句不能寫為if…else if…else語句,因為有可能res[id2]*2、res[id3]*3和res[id5]*5中的某兩個甚至三個相等,如果改為if…else if…else語句,那麼很有可能在後面還會出現重複的數字。

演算法分析完畢,總體思想感覺與斐波那契數列的解法類似,不過這裡要稍微複雜一點。

返回第n個醜數

把只包含質因子2 3和5的數稱作醜數 ugly number 例如 2,3,4,5,6,8,9,10,12,15,等,習慣上我們把1當做是第乙個醜數。寫乙個高效演算法,返回第n個醜數。解法1 判斷某個數是否為醜數,連續找到第n個醜數 include using namespace std bool ...

找到第N個醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。找到第n個醜數 方法1 存放num之前所有元素是否是醜數的flag int getuglynumber solution in...

LeetCode Python 第n個醜數

挨個找的方法,效率比較低 def findkthugly k count 0 n 1 while true if isugly n count 1 if count k return n else n 1 def isugly number while number 2 0 number numbe...