题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
题解:
由题意可知,只含有2、3和5的数是丑数,所以设a2,a3,a5分别记录将是哪个数字的*2,*3,*5倍,然后取最小的
index=1,此时设a2=0,a3=0,a5=0,返回1;
index=2,此时,分别用num[0]*2,num[0]*3,num[0]*5,然后取最小的,返回2*1;然后将a2+1,下一个*2 将会是在num[1]上乘;
index=3,此时,分别用num[1]*2,num[0]*3,num[0]*5,然后取最小的,返回3*1;然后将a3+1,下一个*3 将会是在num[1]上乘;
index=4,此时,分别用num[1]*2,num[1]*3,num[0]*5,然后取最小的,返回2*2;然后将a2+1,下一个*2 将会是在num[2]上乘;
index=5,此时,分别用num[2]*2,num[1]*3,num[0]*5,然后取最小的,返回5*1;然后将a5+1,下一个*5 将会是在num[1]上乘;
...
index=n,返回。。。
(一句废话,感觉几乎每题都要考虑0这个情况,一时疏忽,就会报错)
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index==0)return index;
vector<int>res(index);
res[0]=1;
int t2=0,t3=0,t5=0;
for(int i=1;i<index;++i){
res[i]=min(res[t2]*2,min(res[t3]*3,res[t5]*5));
if(res[i]==res[t2]*2)t2++;
if(res[i]==res[t3]*3)t3++;
if(res[i]==res[t5]*5)t5++;
}
return res[index-1];
}
};