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