题目:输出第n个丑数(关于丑数的定义见ugly number)
分析:这就需要生成n个丑数。我们可以看到,1是丑数,然后其2,3,5倍皆是丑数。这要求我们将2,3,5的幂都排序,可以用优先队列来做,也可以依大小生成:每次生成的是乘以2,3,5中最小的,然后乘过的做一个标记。
答案:
class Solution {
private: int findMin(int a, int b, int c){
if (a < b)
return (a<c?a:c);
else
return (b<c?b:c);
};
public:
int nthUglyNumber(int n) {
vector<int> res(n);
if (n < 0)
return 0;
res[0] = 1;
int i2=0, i3=0, i5 = 0;
for (int i = 1; i < n ; i++){
res[i] = findMin(res[i2]*2, res[i3]*3, res[i5]*5);
if (res[i] == res[i2]*2)
i2++;
if (res[i] == res[i3]*3)
i3++;
if (res[i] == res[i5]*5)
i5++;
}
return res[n-1];
}
};