(配列33最小の数に配置された)旧魏を学ぶためにあなたを取るの申し出を受賞---ブラシタイトルシリーズ

33.アレイは、最小数に配置され

問題:

これは、2、3及び5は醜い(醜い数)と呼ばれる素因数の数のみを含んでいます。それは7個の素因数が含まれているため、例えば6,8は、14醜いではなく、いくつかあります。伝統的に、我々は最初の醜い数として1を持っています。N醜い多数配列を通して上昇を求めます。

ソリューション:

思想:

簡単な説明を理解する:
第一に、私たちが知っている醜いの定義から、要因の数だけ2,3,5-醜い、醜いので、数p = 2 ^ X * 3 ^ Y * 5 ^ Z、 換言すれば、数醜いです醜い定数が2または3を掛けまたは5で乗算され、別の数を乗じ、その後、我々は中3から、醜い番号3を取得2,3,5、乗算2,3,5からスタート4,6,10,6,9,15,10,15,25は醜い番号9を得る2,3,5醜い出発の数を乗じ、我々は醜い***この方法の数は、繰り返し取得するが、私たちすることがわかりましたタイトルは醜い、このような方法の醜い数が得られる疾患の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,0、キューARRのヘッド[1] * 2 = 4 、ARR [1] * 3 = 6、ARR [0] * 5 = 5

Pythonコード:

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        
        if(index<=0):
            return 0
        ugly_num=[1]
        index_first=0
        index_third=0
        index_five=0
        
        for _ in range(index-1):
            newugly=min(ugly_num[index_first]*2,ugly_num[index_third]*3,ugly_num[index_five]*5)
            ugly_num.append(newugly)
            if(newugly%2==0):
                index_first+=1
            if(newugly%3==0):
                index_third+=1
            if(newugly%5==0):
                index_five+=1
                
        return ugly_num[-1]
公開された160元の記事 ウォン称賛30 ビュー70000 +

おすすめ

転載: blog.csdn.net/yixieling4397/article/details/104988875