タイトル
[2、3及び5は醜い(醜い数)と呼ばれる素因数の数だけ含まれています。それは7個の素因数が含まれているため、例えば6,8は、14醜いではなく、いくつかあります。伝統的に、我々は最初の醜い数として1を持っています。] N番目の醜い多数配列に対して上昇を求めます
方法:
1、分析
各使用による方法の数は、大幅に効率が低下するかどうか。そのため、時間のためのスペースを経由して、醜い番号のすべての種類は、その後、直接使用することができます
醜いのN番目の数に単離された時間複雑。
2又は3又は5のみ醜い素因数の数は、すべての数字は、いくつかの醜い醜い上記乗算され得ることができるので2若しくは3若しくは5取得します。したがって、これらの醜いソートの数を格納するために使用する配列を作成します。醜いは、次の数は、上記乗じ醜い醜い醜いの数であり、現在の番号民と仮定されます2若しくは3若しくは5醜い結果が得られ、それは民よりも大きいことを最低限の数。同時にK2、K3、K5を掛けた使用のために醜い最後のレコードの数を計算します2、3、5場所。
図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;
}
};