醜い数(23)

タイトル

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


方法:
1、分析
各使用による方法の数は、大幅に効率が低下するかどうか。そのため、時間のためのスペースを経由して、醜い番号のすべての種類は、その後、直接使用することができます インクルード 1 O(1) 醜いのN番目の数に単離された時間複雑。
2又は3又は5のみ醜い素因数の数は、すべての数字は、いくつかの醜い醜い上記乗算され得ることができるので2若しくは3若しくは5取得します。したがって、これらの醜いソートの数を格納するために使用する配列を作成します。醜いは、次の数は、上記乗じ醜い醜い醜いの数であり、現在の番号民と仮定されます2若しくは3若しくは5醜い結果が得られ、それは民よりも大きいことを最低限の数。同時にK2、K3、K5を掛けた使用のために醜い最後のレコードの数を計算します235場所。
図2に示すように、コード

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<=0)
            return 0;
        //因为1~6都是丑数,所以可以直接返回其值
        if(index<7)
            return index;
        int *temp=new int[index];
        temp[0]=1;
        int k2=0,k3=0,k5=0;
        for(int i=1;i<index;++i)
        {
            temp[i]=min(temp[k2]*2,temp[k3]*3,temp[k5]*5);
            //若当前丑数为k2位置的丑数乘以2,则下一次再乘以2之前,k2的位置必须前移一下
            if(temp[i]==temp[k2]*2)
                ++k2;
            if(temp[i]==temp[k3]*3)
                ++k3;
            if(temp[i]==temp[k5]*5)
                ++k5;
        }
        return temp[index-1];
    }
    
    int min(int a,int b,int c)
    {
        int tmp=(a<b)?a:b;
        return (tmp<c)?tmp:c;
    }
};

方法2:
各番号を介して、1から開始し、それは醜い番号であるかどうかを決定します。シーケンス番号N醜いまで、以降増加します場合。この方法は、デジタル醜いない、低効率であるだけでなく、計算の多くが決定されます。

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<=0)
            return 0;
        int Num=0;
        int theOrder=0;
        while(theOrder<index)
        {
            ++Num;
            if(IsUglyNumber(Num))
            {
                ++theOrder;
            }
        }
        return Num;
    
    }
    // 判断是否为丑数的方法
    bool IsUglyNumber(int num)
    {
        while(num%2==0)
            num/=2;
        while(num%3==0)
            num/=3;
        while(num%5==0)
            num/=5;
        
        return (num==1)?true:false;
    }
};
公開された213元の記事 ウォン称賛48 ビュー110 000 +

おすすめ

転載: blog.csdn.net/Jeffxu_lib/article/details/104745272