264. Ugly Number II (丑数 II)
1. 题目翻译
写一个函数,找到第n大的丑数。丑数是一个只包含2,3,5作为因子的正整数。例如,6,8,9都为丑数,但是14不是因为14含有因子7。我们通常认为1是第一个丑数。
2. 解题方法
考虑到丑数的性质,我们可以发现,一个丑数自己乘以2,3,5必定是一个丑数。除1以外,一个丑数一定是另一个比它小的丑数乘以2,3,5中的一个数或多个数得来的。
所以,我们可以从1开始将得到的丑数每个都乘以2,3,5然后抛除重复的并按序排列就可以得到第n大的丑数。
为了减小时间复杂度,避免排序。假如当前已求得的丑数中最大的为M。下一个比M大的数,一定是它前面某个丑数A乘以2或者B乘以3或者C乘以5之间最小的且比M大的那一个。所以我们可以用3个变量i_2,i _3, i_5 指向M前的3个数, i_2为第一个乘以2大于M的数,i_3为第一个乘以3大于M的数,i_5为第一个乘以5大于M的数。
3. 代码
//Runtime: 9ms
class Solution {
private:
int min(int a,int b,int c){
if(a<=b&&a<=c)
return a;
if(b<=a&&b<=c)
return b;
if(c<=a&&c<=b)
return c;
}
public:
int nthUglyNumber(int n) {
if(n<=0)
return 0;
vector<int> ugly;
ugly.push_back(1);
int i_2 = 0;
int i_3 = 0;
int i_5 = 0;
int temp = 1;
while(ugly.size()<n){
temp = min(ugly[i_2] * 2, ugly[i_3] * 3, ugly[i_5] * 5);
ugly.push_back(temp);
while(ugly[i_2]*2<=temp)
i_2++;
while(ugly[i_3]*3<=temp)
i_3++;
while(ugly[i_5]*5<=temp)
i_5++;
}
return ugly[n-1];
}
};