--33オファーがシリーズに勝った。醜い数

Q:素因数2、3及び5番の番号のみが含まれては醜い(醜い番号)と呼ばれます。それは7個の素因数が含まれているため、例えば6,8は、14醜いではなく、いくつかあります。伝統的に、我々は最初の醜い数として1を持っています。N醜い多数配列を通して上昇を求めます。
T :(おかげで@やむを得ず、注意勉強インとアウト)

簡単な説明を理解する:
第一に、私たちが知っている醜いの定義から、要因の数だけ2,3,5-醜い、醜いので、数p = 2 ^ X * 3 ^ Y * 5 ^ Z、 換言すれば、数醜いです醜い定数が2または3を掛けまたは5で乗算され、別の数を乗じ、その後、我々は中3から、醜い番号3を取得2,3,5、乗算2,3,5からスタート2,3,5 4,6,10,6,9,15,10,15,25は醜い番号9を得る醜い出発の数を乗じ、我々は、これは醜いの数を繰り返していることがわかったが、我々は尋ねた最初の質問ですNの醜い数は、このような方法醜い得られた数が乱れています。その後、我々は3つのキューを維持することができる:
(1)醜い配列の数:1
2:コホート2乗算して
キュー3を乗じ:3を
5:5つのキューによって
アレイの三個の醜いキューヘッド番号の最小2を添加した選択最小数は2,3,5に3つの待ち行列が乗算されている間、
醜いアレイの(2):1,2-
4:キュー2を乗じ
3を乗じたキュー:3,6は
5乗じキュー:5,10
最小数が2,3,5に3つの待ち行列が乗算されているが、3つのキューアレイの最小数3を添加醜いヘッドを選択し、
アレイ醜いの数(3):1,2,3
4,6:キュー2を乗じ
6,9:コホート3乗算
コホート5乗算:10、15
、前方4は醜い添加したアレイの三個のキューの最小数を選択する最小数の一方2,3,5の3つのキューに乗じる;
(4)醜い配列の数:1,2,3,4
逓倍キュー2:6,8
キュー3を乗じ:6,9
回5キュー:5,10,15,20-
最小の番号が2,3,5に3つの待ち行列が乗算されながら、前方配列番号5の添加醜い3つのキューの最小値を選択するステップと、
(5)醜いアレイの数:1,2,3,4,5
キュー2を乗じた:6,8,10、
3つのキューを乗じた:6,9,12,15
5乗じキュー:10,15,20,25
、予め3つのキューの最小数を選択することは、6醜い加え配列の、私たちは12,18,30を3つのキューの間、私たちは、キューの2つのヘッドをポップ、6頭の2つのキューがあることがわかった。
........................
質問:
1.なぜ3つのキュー?
私たちは同時に、過去に比べ、2が3を掛けてはいけません選出の最小数を乗じた2,3,5の数醜い配列からなので、数の醜い配列の数は、秩序ある必要があります同一の内部キューが整然となるように2を乗じた3つの内部キュー、3は、時系列順に配置したため、
2なぜ配列の数に比較的醜いヘッド3つのキューの最小数は?
3がキュー注文されているので、ヘッドは最小3を抽出し、最小を見つけるために、すべての3つのキューの数に相当します。
アイデアの実現:
私たちは、3つのキューを維持する必要がないだけ記録3つのポインタがステップに到達するかを示す、「|」のポインタを表し、醜いARR配列の数を表す;
(1)1
| 2
| 3
| 5
現在0,0へのポインタ、0、キューヘッドARR [0] * 2 = 2、ARR [0] = * 3 3、ARR [0] * = 5.5。
(2)1 2。
2 | 4
|。3. 6
|。5 10
キューヘッドARRに1,0,0現在のポインタ* = 2.4、ARR [0] = * 3 3、ARR [0] = 5.5 * [1]。
(3)3.1 2。
2 |。6. 4
。3 |。6 9
|。5 10 15
[1] [1]。現在のポインタが1,1,0、キューヘッドARR * = 2.4、ARR = * 3 6、ARR [0] * = 5.5
..................

A:

    int GetUglyNumber_Solution(int index) {
        if (index <= 0)
            return -1;
        vector<int> array;
        int pos2 = 0;
        int pos3 = 0;
        int pos5 = 0;
        array.push_back(1);
        int temp = 0;
        for (int i = 1; i < index; i++) {
            temp = min3(array[pos2] * 2, array[pos3] * 3, array[pos5] * 5);
            array.push_back(temp);
            if (temp == array[pos2] * 2)
                pos2++;
            if (temp == array[pos3] * 3)
                pos3++;
            if (temp == array[pos5] * 5)
                pos5++;
        }
        return array[index - 1];
    }

    int min3(int a, int b, int c) {
        int temp;
        temp = a < b ? a : b;
        return temp < c ? temp : c;
    }

おすすめ

転載: www.cnblogs.com/xym4869/p/12312548.html