尋找丑數(shù)

算法題:尋找丑數(shù)

這是一道在訂閱的blog上看到的題目,覺得比較有意思建邓,就動(dòng)手做了一下磷瘤。

何為丑數(shù)?

丑數(shù)(Ugly number)是指其因子中只包含2、3贱田、5的整數(shù),類如6嘴脾、20男摧、36都是丑數(shù),而7统阿、19彩倚、28則不是丑數(shù)筹我。特別的:1是最小的丑數(shù)

題目:求從小大到的情況下第1500個(gè)丑數(shù)

解題過程:

  1. 原始解法:

從1開始扶平,判斷當(dāng)前數(shù)字是否丑數(shù),不是則跳至下一個(gè)數(shù)字蔬蕊,是的話下標(biāo)+1结澄,如果下標(biāo)增加到指定的數(shù)字,則此時(shí)對(duì)應(yīng)的數(shù)字為要求的丑數(shù)岸夯。這個(gè)解法簡(jiǎn)單粗暴麻献,可以說毫無技術(shù)含量。因?yàn)槊恳粋€(gè)數(shù)都要與2猜扮、3勉吻、5輾轉(zhuǎn)相處,并且要遍歷答案之前的每一個(gè)自然數(shù)旅赢,時(shí)間復(fù)雜度太差齿桃。

  1. 改進(jìn)解法:

實(shí)際上我們可以試圖跳過那些不是丑數(shù)的自然數(shù),考慮一下丑數(shù)是怎么得來的:從1開始煮盼,12=2短纵,13=3,1*5=5僵控,然后從得到的2香到、3、5繼續(xù)乘以對(duì)應(yīng)的2、3悠就、5得到新的數(shù)字千绪。這樣得到的數(shù)字都是丑數(shù),因?yàn)椴豢赡馨渌囊蜃庸FⅰD敲次覀兛梢試L試著來構(gòu)造一個(gè)從小到大排列的數(shù)組翘紊,數(shù)組的長(zhǎng)度就是我們需要的丑數(shù)序號(hào)。
接下來的問題是:如何保持?jǐn)?shù)組在構(gòu)造的過程中是有序的藐唠?
假設(shè)我們現(xiàn)在有了部分?jǐn)?shù)組帆疟,要添加一個(gè)新的丑數(shù)。新的丑數(shù)必然是從已有的數(shù)中宇立,分別乘2踪宠、3、5之后獲得妈嘹,為保持有序我們只取其中最小的數(shù)字柳琢,因?yàn)檫@三個(gè)數(shù)字中間也許還有其他的丑數(shù)。實(shí)際上這樣存在不必要的計(jì)算:可能存在一些數(shù)字润脸,乘以對(duì)應(yīng)的2柬脸、3、5之后也比當(dāng)前存在的最大丑數(shù)要小毙驯,而我們只需要乘以2倒堕、3、5之后比當(dāng)前最大丑數(shù)大的那個(gè)數(shù)爆价。所以垦巴,對(duì)應(yīng)2、3铭段、5這三個(gè)因子骤宣,我們應(yīng)該保存三個(gè)位置,使得這三個(gè)位置上的數(shù)字乘以對(duì)應(yīng)的2序愚、3憔披、5之后比當(dāng)前最大丑數(shù)大。怎么找爸吮?很簡(jiǎn)單芬膝,每次插入新的丑數(shù)之后,我們更新一下這三個(gè)數(shù)的位置就可以了拗胜。下一次就對(duì)這三個(gè)位置的數(shù)字分別乘以2蔗候、3、5埂软,找出最小的插入數(shù)組锈遥。這樣我們就保證了數(shù)組有序纫事,并盡量減少了不必要的計(jì)算。

C++代碼實(shí)現(xiàn):

#include <iostream>

int get_min_number(int a, int b, int c)
{
    int min_ab = std::min(a,b);
    return std::min(min_ab, c);
}
int find_ugly_number(int target)
{
    if (target < 1)
        return 0;
    int* array = new int[target];
    array[0] = 1;
    int *pos2 = array;
    int *pos3 = array;
    int *pos5 = array;
    int index = 1;

    while (index < target)
    {
        int cur_max = get_min_number(*pos2*2, *pos3*3,*pos5*5);
        array[index++] = cur_max;

        while (*pos2*2 <= cur_max)
            pos2++;
        while (*pos3*3 <= cur_max)
            pos3++;
        while (*pos5*5 <= cur_max)
            pos5++;
    }

    int ret = array[target-1];
    delete [] array;
    return ret;
}


int main()
{
    int index = 1500;
    int result = find_ugly_number(index);
    std::cout << result << std::endl;
    return 0;
}

代碼也被我放在我Github的issues庫(kù)中所灸,點(diǎn)擊查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丽惶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爬立,更是在濱河造成了極大的恐慌钾唬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侠驯,死亡現(xiàn)場(chǎng)離奇詭異抡秆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吟策,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門儒士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人檩坚,你說我怎么就攤上這事着撩。” “怎么了匾委?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵拖叙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我赂乐,道長(zhǎng)薯鳍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任沪猴,我火速辦了婚禮辐啄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘运嗜。我一直安慰自己,他們只是感情好悯舟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布担租。 她就那樣靜靜地躺著,像睡著了一般抵怎。 火紅的嫁衣襯著肌膚如雪奋救。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天反惕,我揣著相機(jī)與錄音尝艘,去河邊找鬼。 笑死姿染,一個(gè)胖子當(dāng)著我的面吹牛背亥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼狡汉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼娄徊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盾戴,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤寄锐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尖啡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄仆,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年衅斩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沿癞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矛渴,死狀恐怖椎扬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情具温,我是刑警寧澤蚕涤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站铣猩,受9級(jí)特大地震影響揖铜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜达皿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一天吓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峦椰,春花似錦龄寞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至滔金,卻和暖如春色解,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背餐茵。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工科阎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忿族。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓锣笨,卻偏偏與公主長(zhǎng)得像蝌矛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子票唆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容