ugly number:
一个数的的素因数只有2,3,5,其中1是ugly number。
这道题要求找到第n个ugly number。
思路如下:
第一个是1,
以后的数要求与2,3,5相乘找到其中的最小的值,将其存在数组num中
例如:
l2=l3=l5=0;都对应第一个数num[0]。
n=4, 第一个元素1分别与2,3,5相乘,得到2,3,5,将2存在数组中num[1]=2;l2++,指向num[1];
下次将1与3,5相乘,2与2相乘,得到最小值3,存在数组中num[2]=3,l3++,指向num[1];
一直进行n-1次。
其中在判断是乘哪个得到的最小值,要进行if();if();if()判断而不是if() else if。
这是因为当num有 1,2,3,4,5,6时,l2=2指向3,l3=l5=1指向2。这时num[l2]*2==num[l3]*3,这个需要同时对l2++,l3++。
代码如下:
class Solution{
public:
int nthUglyNumber(int n){
vector<int> num(1,1);
int m,l2=0,l3=0,l5=0;
if(n==1) return 1;
n--;
cout<<num.back()<<endl;
while(n){
m=min(num[l2]*2,min(num[l3]*3,num[l5]*5));
num.push_back(m);
cout<<n<<" "<<num.back()<<" "<<l2<<" "<<l3<<" "<<l5<<endl;
n--;
if(num[l2]*2==m) l2++;
if(num[l3]*3==m) l3++;
if(num[l5]*5==m) l5++;
}
return m;
}
};