题目
我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。
例如6、8都是丑数,但14不是,因为它包含质因子7。
求第n个丑数的值。
样例
输入:5
输出:5
注意:习惯上我们把1当做第一个丑数。
解法:三路归并
将2,3,5生成的丑数合并到一个数组当中,记录2,3,5生成的最后一个数对应的位置,每次从三个生成的数当中取最小的加入到数组中,同时更新相应的位置。
这样直接由丑数生成新丑数,而不是逐个数字判断,效率得到提高
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
int getUglyNumber(int n) {
vector<int> v;
v.push_back(1);
int i = 0, j = 0, k = 0;
while (--n) {
int num = min(v[i] * 2, min(v[j] * 3, v[k] * 5));
v.push_back(num);
if (num == v[i] * 2) i++;
if (num == v[j] * 3) j++;
if (num == v[k] * 5) k++;
}
return v.back();
}
};