劍指offer 醜數

2021-10-05 18:22:49 字數 918 閱讀 9500

把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

建立陣列儲存已找到的醜數,res[index]

根據醜數的定義,除了res[0] = 1,醜數陣列的每個數應該是前面的醜數乘以2,3,5的結果。接下來應該思考的是如何儲存醜數,排序並沒有重複。

將陣列中最大的醜數記為 max;

下乙個醜數 生成:前面每個醜數乘以 2 生成一系列數字,小於 max 的數字已在陣列中,大於 max 的第乙個數字記為 m2。同理生成 m3,m5。那麼下乙個醜數應該是 m2,m3,m5 中最小的數。

因此需要三個指標來記錄當前m2,m3,m5 中最小的數。當其被選為新的最小值後,要把相應的指標+1;因為這個指標會逐漸遍歷整個陣列,因此最終陣列中的每乙個值都會被乘以2、乘以3、乘以5。

要求返回第n個醜數,所以最後返回 res[index - 1]。

時間複雜度:o(n):n = index,遍歷計算列表

空間複雜度:o(n):長度為 index 的額外空間

public

class

uglynumber

int[

] res =

newint

[index]

; res[0]

=1;int p2 =

0, p3 =

0, p5 =0;

for(

int i =

1; i < index; i++)if

(res[i]

== res[p3]*3

)if(res[i]

== res[p5]*5

)}return res[index -1]

;}}

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...

劍指Offer 醜數

我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...