醜い数33

トピック要件:素因数2、3と番号5の数だけを含有するが、醜い(醜い番号)と呼ばれます。それは7個の素因数が含まれているため、例えば6,8は、14醜いではなく、いくつかあります。伝統的に、我々は最初の醜い数として1を持っています。N醜い多数シーケンスを昇順シーク。

判定方法

アップ割り切れないまで、および5加えて、これまで割り切れない、との加算への最初の2ほかは、3まで分割されません。最終残数1かどうか判断し、数1は数、醜い醜いしたかどうか。

1、2、3、4、5、6、8、9、10、12、15、16、18、20、24、25、27、30、32、36:20は、フロント醜い数です。

 

しかし、この問題は、番号が醜いかどうかを判断するために番号を入力できるように、しかし、あなたに対応するインデックス番号、醜いの出力インデックス番号の数を与えることではありません

 

1  インポートjava.lang.Mathに、
 2つの java.utilのインポートクラス*。;
 3  パブリック クラスソリューション{
 4      公共 INT GetUglyNumber_Solution(INT インデックス){
 5は         // 特殊な場合を考える
6。         IF(指数<= 0戻り 0 ;
 7          IF(インデックス> 0 &&インデックス< 7リターン指数;
 8          INT P2 = 0、P3 = 0、P5 = 0 ; // 3つのポインタポインタ
 9。         // すべての醜いリストの数記憶するために使用される
 10          // 数が実際に格納されている   ()List.get、すなわち、インデックスに使用される、012345678を
 11          // 実際のストレージ醜い1234 6. 8 9 5 10 
12である          のArrayList <整数> =一覧新しい新規のArrayList <整数> ();
 13である          (List.add 。1 );
 14          ながら(はlist.size()< インデックス){
 15              INT M2 =一覧。GET(P2) * 2 ;
 16              int型 M3 =一覧。GET *(P3)3。;
 17              INT。M5 =一覧GET(P5)*5 ;
18              INTの分= Math.min(M2、Math.min(M3、M5))。
19              list.add(分)。
20              であれば(分== M2)P2 ++ 21              であれば(分== M3)P3 ++ 22              であれば(分== M5)P5 ++ 23          }
 24          リターンリスト。取得(はlist.size()を- 1 );
25      }
 26 }

 

 

 

説明を理解しやすい:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b出典:牛オフネットワーク)

まず、我々は知っている醜いの定義から、別の醜いによる要因の数だけ2,3,5-醜いので、醜い数p = 2 ^ X * 3 ^ Y * 5 ^ Z、換言すれば一定数の醜いです2または3または5を掛け乗じた数を乗じ、その後、我々は2,3,5を乗じた1から開始し、2,3,5の3つの数字は醜い取得するには、2を乗じたこれらの3個の数字から醜い出発3,5 4,6,10,6,9,15,10,15,25は醜い番号9を取得し、私たちは、この数は醜い繰り返されることがわかった、と私たちは醜いのN個のタイトルを主張しますこの方法によって得られたそのような醜いの数が不規則です。その後、我々は3つのキューを維持することができます。
醜いアレイの(1)数:1
2:2を乗じたキュー
3:3を乗じたキュー
図5は、キューを乗じ:5
最小数が乗算されている間、アレイの最小3つのキューの先頭番号を選択することは、2醜い加え2,3,5 の3つのキューに。
(2)数醜い配列:1,2
4:2を乗じたキュー
3を乗じたキュー:3.6
5逓倍キュー:5,10
選択最小数を乗算しながら3を有する最小数3醜いキューヘッドアレイを、添加した2,3,5の3つのキューに。
醜いアレイの(3)番号:1,2,3
2を乗じたキュー:4,6
3を乗じたキュー:6,9
5逓倍キュー:5,10,15
先にアレイの最小3つのキューを選択し、最小数を乗算しながら、醜い番号4を添加した2,3,5の3つのキューに。
醜いアレイの(4)番号:1,2,3,4
2を乗じたキュー:6.8
3を乗じたキュー:6,9,12
5逓倍キュー:5,10,15,20-
最小数を乗算しながら、前方配列番号5の添加醜い3つのキューの最小値選択2,3,5の3つのキューにします。
醜い配列の(5)番号:1,2,3,4,5
2を乗じたキュー:6,8,10、
6,9,12,15:3を乗じたキュー
5逓倍キュー:10,15,20,25
先に配列の最小の3つのキューを選択醜い数6を添加し、我々は2個のキューヘッド6があることを発見したので、私たちは三つにキュー12,18,30ながら、キューの2ポップアップ頭を持っています。
........................
質問:
1.なぜ3つのキュー?
丑数数组里的数一定是有序的,因为我们是从丑数数组里的数乘以2,3,5选出的最小数,一定比以前未乘以2,3,5大,同时对于三个队列内部,按先后顺序乘以2,3,5分别放入,所以同一个队列内部也是有序的;
2.为什么比较三个队列头部最小的数放入丑数数组?
因为三个队列是有序的,所以取出三个头中最小的,等同于找到了三个队列所有数中最小的。
实现思路:
我们没有必要维护三个队列,只需要记录三个指针显示到达哪一步;“|”表示指针,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
目前指针指向1,0,0,队列头arr[1] * 2 = 4,  arr[0] * 3 = 3, arr[0] * 5 = 5
(3)1 2 3
2| 4 6
3 |6 9
|5 10 15
目前指针指向1,1,0,队列头arr[1] * 2 = 4,  arr[1] * 3 = 6, arr[0] * 5 = 5

 

おすすめ

転載: www.cnblogs.com/shareidea94/p/11119904.html