安全プランを証明する:醜い数(javaの)

タイトル:私たちは醜い数(醜い番号)と呼ばれる唯一の要因2,3,5番号が含まれています。醜いの多数の最初の1500昇順を探しています。それは我々が最初の醜いとして番号を入れて使用率7が含まれているため、例えば6,8は、14醜いではなく数です。

各個別整数解を分析して醜い数が、あまり効率的かつ直感的ではありません

    Mは、別の因子の数と呼ばれる数nであり、nでm個の分割を意味する、と言うのn%のM == 0のみ2,3,5-分割することができる醜い、醜い数の定義。3で割り切れる場合は、連続した3により分割された;我々連続2によって2によって場合数字割り切れることがこの手段我々が取得5は分割することができれば、それは最終的に5によって分割された場合には、1でありますしたがって、この番号は、そうでない場合は、醜いの数ではありません。

public boolean isUgly(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;  
    }  
    public int getUglyNumber(int index){  
        if(index <= 0)  
            return 0;  
        int number = 0;  
        int uglyFound = 0;  
        while(uglyFound < index){  
            number++;  
            if(isUgly(number)){  
                ++uglyFound;  
            }  
        }  
        return number;  
    }  
時間・ソリューションのためのスペースで、醜いの数を維持することが見出された配列を作成します。

    理由は効率の悪い以前のアルゴリズム、数は、我々はその計算をしなければならない醜い数ではない主な理由かどうか。次に、我々はむしろ醜いの非整数倍に費やされた時間よりも、単に醜い数字を計算する方法を見つけることを試みました。醜い、醜い醜い数の定義は、2,3,5の別の数を乗じする必要があります。したがって、我々は数値が醜い番号をソートされる配列を作成することができ、それぞれの数は2,3,5乗じ醜い醜いフロントの数です。

    このアイデアの鍵となるのは、配列をソートする醜い内部の数を決定する方法です。配列は、配列に格納され、いくつかの醜い後に並んだ、とM、我々は醜いの番号を生成する方法を分析しようとしている次のと表記醜いの最大数を持っているために、いくつかを持っていると仮定。数は2,3,5の数を乗じた醜い醜いの前に確かにあります。2を乗じたときしたがって、我々は最初の2各数を乗じ、既存の醜いを検討し、その結果は、いくつかの小さなより得られるか、またはMさんに等しくすることができます。それは以下Mの順に応じて生成されているので、確かに配列されて、私たちは再び検討する必要がありました。私たちは醜いたいので、得られた結果、複数のMよりも大きくなりますが、我々は唯一の最初の結果に必要な、Mよりも大きく、カウントが大量の注文を生成するために、昇順の後で、他の多くの結果は言います。2はM2によって得掛けされなければならないの後に私たち最初の結果はMよりも大きくなる。同様に、我々は3,5醜い、最初の結果はM M3とM5よりも大きい得る。だから、乗じたすべての番号を入れています次の番号は、M2、M3、M5醜いする必要があります。この最小の番号3。

    既存の醜いに言及する場合、以前の分析、すべての数は、それぞれ2,3、乗算される。醜いの既存の番号が順次配列に格納されているため、実際には、これは必要ではありません。2を乗じたため、それを2で乗算された後、以下の既存の醜い、醜い各数字の最大数よりなり、結果を得るために、2つの乗算される前に、一定数の醜いT2は醜い行の数の各々が、確かに存在します得られた結果はあまりにも大きくなります。私達はちょうど醜いの位置の数を書き留めする必要がありますが、新しい番号が生成されるたびに醜いが、このT2を更新するとき。逓倍3と5で、それはまた、これと同じT3およびT5を持っています。

public int getUglyNumber_Solution2(int index){  
        if(index <0)  
            return 0;  
        int[] uglyArray = new int[index];  
        uglyArray[0] = 1;  
        int multiply2 = 0;  
        int multiply3 = 0;  
        int multiply5 = 0;  
        for(int i = 1;i<index;i++){  
            int min = min(uglyArray[multiply2]*2,uglyArray[multiply3]*3,uglyArray[multiply5]*5);  
            uglyArray[i] = min;  
            while(uglyArray[multiply2]*2 == uglyArray[i])  
                multiply2++;  
            while(uglyArray[multiply3]*3 == uglyArray[i])  
                multiply3++;  
            while(uglyArray[multiply5]*5 == uglyArray[i])  
                multiply5++;  
        }  
        return uglyArray[index-1];  
    }  
    public int min(int number1,int number2,int number3){  
        int min = (number1<number2)?number1:number2;  
        return min <number3?min:number3;  
    }  
    時間効率が大幅に増加しているように、そして、最初のアイデアに比べて、第2のアプローチは、醜い非整数の上の任意の計算を行う必要はありません。しかし、必要性に起因する第2のアルゴリズムを保存することに留意すべきいくつかの醜いので、それによって、スペースの消費量が増加し、配列を必要とし、生成されました。あなたが最初に1500年醜い数を求めている場合は、メモリアレイ6キロバイトのための醜い、このアカウントの数に対応するために1500の配列を作成します。最初のアイデアは、そのようなメモリのオーバーヘッドはありません。一般に、第2のアプローチは、時間効率にアップグレードするためのより少ないスペースを使用することと等価です。



公開された118元の記事 ウォン称賛35 ビュー120 000 +

おすすめ

転載: blog.csdn.net/abc7845129630/article/details/52739751