劍指Offer-醜數

轉載地址:https://www.jianshu.com/p/9598e96ea6b6

題目:
我們把只包含因子2、3和5的數稱作醜數(Ugly Number)。求按從小到大的順序的第1500個醜數。習慣上把1當做第一個醜數

解法一:
判斷一個數是否是醜數:

bool isUglyNumber(int number) {
    while (number % 2 == 0) {
        number /= 2;
    }
    while (number % 3 == 0) {
        number /= 3;
    }
    while (number % 5 == 0) {
        number /= 5;
    }
    return number == 1 ? true : false;
}

那麼要求第n個醜數,依次迭代即可。

解法二:
思考醜數是怎麼形成的——都是前面已有醜數乘以2、3或5生成的。假設已有醜數已按增序排列,那麼下一個醜數一定是已有醜數分別乘以2、3、5得到的數中大於當前最大丑數中的最小的一個。優化:在乘以2得到的醜數當中有小於當前最大丑數的,也有大於當前最大丑數的,而且一定是某個點前面的小於,後面的大於,我們只需要那個點即可。對於乘以3得到的醜數、乘以5得到的醜數同理。

int min(const int a, const int b, const int c) {
    int min = a < b ? a : b;
    return min < c : min :c;
}
int getUglyNumber(int index) {
    vector<int>  uglyNumbers;
    uglyNumbers.push_back(1);
    int cnt = 1;
    int p2 = 0;
    int p3 = 0;
    int p5 = 0;
    while (cnt < index) {
        uglyNumbers.push_back(min(uglyNumbers[p2]*2, uglyNumbers[p3]*3, uglyNumbers[p5]*5));
        ++cnt;
        while (uglyNumbers[p2]*2 <= uglyNumbers[cnt-1]) ++p2;
        while (uglyNumbers[p3]*3 <= uglyNumbers[cnt-1]) ++p3;
        while (uglyNumbers[p5]*5 <= uglyNumbers[cnt-1]) ++p5;
    }
    return uglyNumbers[cnt-1];
}


作者:qmss
鏈接:https://www.jianshu.com/p/9598e96ea6b6
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發佈了85 篇原創文章 · 獲贊 98 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章