題目描述
把只包含因子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];
}
};