leetcode_313_超級(jí)丑數(shù)

題目:

編寫一段程序來(lái)查找第 n 個(gè)超級(jí)丑數(shù)涛酗。
超級(jí)丑數(shù)是指其所有質(zhì)因數(shù)都是長(zhǎng)度為 k 的質(zhì)數(shù)列表 primes 中的正整數(shù)欺矫。
示例:
輸入: n = 12, primes = [2,7,13,19]
輸出: 32
解釋: 給定長(zhǎng)度為 4 的質(zhì)數(shù)列表 primes = [2,7,13,19]租谈,前 12 個(gè)超級(jí)丑數(shù)序列為:[1,2,4,7,8,1143,,16,19,26,28,32] 篮奄。
說(shuō)明:
1 是任何給定 primes 的超級(jí)丑數(shù)。
給定 primes 中的數(shù)字以升序排列割去。
0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] < 1000 窟却。
第 n 個(gè)超級(jí)丑數(shù)確保在 32 位有符整數(shù)范圍內(nèi)。
<meta charset="utf-8">

解析概念:

質(zhì)數(shù)
質(zhì)數(shù)(prime number)又稱素?cái)?shù)呻逆,有無(wú)限個(gè)夸赫。質(zhì)數(shù)定義為在大于1的自然數(shù)中,除了1和它本身以外不再有其他因數(shù)咖城。
丑數(shù)判斷方法
首先除2茬腿,直到不能整除為止,然后除5到不能整除為止宜雀,然后除3直到不能整除為止切平。最終判斷剩余的數(shù)字是否為1,如果是1則為丑數(shù)辐董,否則不是丑數(shù)悴品。
超級(jí)丑數(shù)
超級(jí)丑數(shù)是指其所有質(zhì)因數(shù)都是長(zhǎng)度為 k 的質(zhì)數(shù)列表 primes 中的正整數(shù)。(質(zhì)因數(shù)不再是2,3,5简烘,而是給定列表prime 中的數(shù)字)

解題方法

本題在網(wǎng)上有很多種解法苔严,本人分享一種自己一步步優(yōu)化,最終通過(guò)leetcode的方法
起始思路也是參考網(wǎng)上大神孤澎,如下:
每一個(gè)新丑數(shù)邦蜜,都可以表示為一個(gè)丑數(shù)乘以質(zhì)因數(shù)數(shù)組中的元素得到
假設(shè)我們已經(jīng)有了數(shù)組長(zhǎng)度為m的元素從小到大排列的的丑數(shù)數(shù)組,那么下一個(gè)滿足條件的丑數(shù)應(yīng)該如何得到呢亥至?其實(shí)無(wú)非就是利用上述規(guī)則:
將已經(jīng)有的丑數(shù)數(shù)組中每一個(gè)元素乘以primes質(zhì)因數(shù)數(shù)組,得到一堆新的丑數(shù)贱迟,從其中挑選出比現(xiàn)有的丑數(shù)數(shù)組大的最少的那一個(gè)元素姐扮,就是下一個(gè)滿足條件的丑數(shù)
說(shuō)到這其實(shí)我們已經(jīng)可以寫出一個(gè)滿足題意的代碼了,缺點(diǎn)就是還是不滿足時(shí)長(zhǎng)限制(本人親測(cè))衣吠,于是參考了劍指offer茶敏,在此基礎(chǔ)上又做了一步改進(jìn)。
改進(jìn)的點(diǎn)就是不再是將所有的丑數(shù)都乘以primes質(zhì)因數(shù)數(shù)組缚俏,而是新增兩個(gè)和primes等長(zhǎng)的數(shù)組惊搏,分別叫 idxPri贮乳、numPri
idxPri數(shù)組中元素滿足如下條件:

ugly[ idxPri[i]  - 1 ] * primes[i] <= ugly[ ugly.length-1 ]

numPri數(shù)組中元素為

numPri[i] = ugly[ idxPri[i] ] * primes[i]

有了這兩個(gè)數(shù)組,每次我們找下一個(gè)丑數(shù)的時(shí)候都是找對(duì)于primes中的每一個(gè)質(zhì)因子恬惯,乘以 ugly 中哪一個(gè)丑數(shù)元素比ugly中最大的丑數(shù)剛好大一點(diǎn)向拆。找到這個(gè)丑數(shù)元素的下標(biāo)我們將其存儲(chǔ)到idxPri中,存儲(chǔ)下標(biāo)與primes對(duì)應(yīng)上酪耳,并把每一個(gè)質(zhì)因子所產(chǎn)生的比ugly最大丑數(shù)大一點(diǎn)的那個(gè)丑數(shù)也按對(duì)應(yīng)下標(biāo)存到numPri中浓恳,對(duì)比numPri中誰(shuí)最小,誰(shuí)就應(yīng)該是下一個(gè)丑數(shù)碗暗。
循環(huán)此過(guò)程颈将,直到ugly長(zhǎng)度達(dá)到n
具體代碼如下

var nthSuperUglyNumber = function(n, primes) {
     var ugly = [1]
     var idxPri = new Array( primes.length ).fill(0)
     var numPri = new Array( primes.length )
     var last = ugly[ ugly.length-1 ] 
    while( n !== ugly.length ){     
        for( var i = 0 ; i < idxPri.length ; i++ ){
            while( ugly[ idxPri[i] ] * primes[i] <= last ) {
                idxPri[i]++;
            }
        }
        for( var i= 0  ; i < idxPri.length ; i++ ){
            numPri[i] = ugly[ idxPri[i] ] * primes[i]
        }
        ugly.push( numPri.reduce( function(a,b){ return a<b ? a : b } ) )
        last = ugly[ ugly.length-1 ]
    }
    return last
 }

劍指offer上對(duì)于這種方法解釋是以空間代價(jià)換時(shí)間代價(jià),其實(shí)大家仔細(xì)看可以看出言疗,每次找出一個(gè)丑數(shù)過(guò)程循環(huán)的次數(shù)少了很多晴圾,但是我們又額外聲明了兩個(gè)數(shù)組,這應(yīng)該就是書上所說(shuō)的空間換時(shí)間噪奄。

呼吸不停死姚,代碼不止!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梗醇,一起剝皮案震驚了整個(gè)濱河市知允,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叙谨,老刑警劉巖温鸽,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異手负,居然都是意外死亡涤垫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門竟终,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝠猬,“玉大人,你說(shuō)我怎么就攤上這事统捶∮苈” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵喘鸟,是天一觀的道長(zhǎng)匆绣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)什黑,這世上最難降的妖魔是什么崎淳? 我笑而不...
    開(kāi)封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮愕把,結(jié)果婚禮上拣凹,老公的妹妹穿的比我還像新娘森爽。我一直安慰自己,他們只是感情好嚣镜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布爬迟。 她就那樣靜靜地躺著,像睡著了一般祈惶。 火紅的嫁衣襯著肌膚如雪雕旨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天捧请,我揣著相機(jī)與錄音凡涩,去河邊找鬼。 笑死疹蛉,一個(gè)胖子當(dāng)著我的面吹牛活箕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播可款,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼育韩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了闺鲸?” 一聲冷哼從身側(cè)響起筋讨,我...
    開(kāi)封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摸恍,沒(méi)想到半個(gè)月后悉罕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡立镶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年壁袄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚媒。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗜逻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缭召,到底是詐尸還是另有隱情栈顷,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布嵌巷,位于F島的核電站萄凤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晴竞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一狠半、第九天 我趴在偏房一處隱蔽的房頂上張望噩死。 院中可真熱鬧颤难,春花似錦、人聲如沸已维。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垛耳。三九已至栅屏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堂鲜,已是汗流浹背栈雳。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缔莲,地道東北人哥纫。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痴奏,于是被迫代替她去往敵國(guó)和親蛀骇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350