劍指 Offer 49 醜數

2021-10-08 02:26:34 字數 1210 閱讀 9942

我們把只包含質因子 2、3 和 5 的數稱作醜數(ugly number)

求按從小到大的順序的第 n 個醜數。

出看這道題可能感覺能算,但是思路就非常繁瑣。

解法一:

這個只說說思路,既然2,3,5是該數的因子,那麼該數除以2,3,5的餘數一定是 0 ,那麼就讓每個數連續除以2,3,5,只到餘數不為0 ,結果是1的就是醜數,在比較各個醜數的大小,取出我們想要的那個醜數。

(看看就行~~~ )

解法二:

把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。

習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

可能剛開始沒看懂題意,這裡解釋一下

1是醜數,然後是質因數為2,3,5的數

就是說4是兩個醜數2相乘得到的乙個醜數

6是2*3的到的醜數

8是2*4得到的醜數

就是說醜數是由前面的乙個醜數乘以2或3或5得到的。

題解:如何得到前乙個醜數那,

存放醜數陣列res,res陣列裡的第乙個元素為1。因為我們要讓醜數數列有序,所以要每次使這三個因子組成的最小的數進入陣列。

t2表示乘以2得到的醜數,t3表示乘以3得到的醜數,t5是乘以5得到的醜數,

把最小的進入醜數陣列arr

res: 1

t2: 2

t3: 3

t5: 5

比較(2,3,5)->min_n = 2, 2進入 arr

res:1 2

t 2: 4

t 3: 3 6

t 5: 5 10

然後比較當前的值(4,3,5),3再進入arr

res 1 2 3

t 2: 4

t 3: 6 9

t 5: 5 10

(4, 5, 6) 得到4進入arr

····

知道目標陣列的最後一位出現,我們將最後乙個值返回。

**

/**

* @param n

* @return

*/var

nthuglynumber

=function

(n)// console.log(arr[n-1])

return arr[n -1]

};

劍指Offer 49 醜數

我們把只包含因子2 3和5的數稱為醜數。求按從小到大的順序的第1500個醜數。例 6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當作第乙個醜數。遍歷數字,對每個數字判斷是否只包含2 3 5因子。問題在於,有很多無用的計算,增加時間複雜度。時間複雜度 o n 空間複雜度 o 1 可以發現...

劍指offer49 醜數

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 1.每次找出乙個最小丑數res i 都會產生三個新的醜數,2 res i 3 res i 5 res i 2.如果我...

劍指 Offer 49 醜數

每個醜數都等於它前面離它最遠的醜數 且還沒被乘過2 3 5 通過乘2或者3或者5得到的最小值。因此主要的任務就是找到離他最遠的還沒被乘過2的數,離他最遠的還沒被乘過3的數,離他最遠的還沒被乘過5的數,將這些數乘2,3,5,比較大小,取最小值為當前的醜數。用a,b,c作為截止目前為止最遠的還沒被乘過2...