题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
第一种思路:暴力,计算每个数是不是丑数,是的话计数加一,超时。
class Solution {
public:
int GetUglyNumber_Solution(int index) {
int num=1;
while(1){
if(isUglyNumber(num))
--index;
if(index==0)
break;
++num;
}
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);
}
};
第二种思路:将之前的丑数保存下来,后面的丑数肯定是前面的丑数乘以2,3或5得到的,所以现在的问题就是将丑数按顺序保存下来。假设现在已经有排序好的丑数,计算乘以2,3,5后第一个大于已有的最大的丑数的数字,M2,M3和M5,三个数中的最小值就是下一个丑数。
class Solution {
public:
int GetUglyNumber_Solution(int index) {
vector<int> uglyNumbers;
int p2=0,p3=0,p5=0;
uglyNumbers.push_back(1);
while(uglyNumbers.size()<index){
int min3=min(min(uglyNumbers[p2]*2,uglyNumbers[p3]*3),uglyNumbers[p5]*5);
uglyNumbers.push_back(min3);
if(min3==uglyNumbers[p2]*2) ++p2;
if(min3==uglyNumbers[p3]*3) ++p3;
if(min3==uglyNumbers[p5]*5) ++p5;
}
return uglyNumbers[index-1];
}
};