我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。
例如6、8都是丑数,但14不是,因为它包含质因子7。
求第n个丑数的值。
样例
输入:5
输出:5
注意:习惯上我们把1当做第一个丑数。
思路:
数学归纳的思路。假设确定了第i个丑数,要确定第i+1个丑数,方法一定是从已有的丑数中抽取一个并与2,3,5中一个数相乘,结果要大于第i个质数,且结果最小。维护一个location数字,代表这个质数乘上对应位置的丑数后,结果大于第i个质数的最小位置。
class Solution {
public:
int getUglyNumber(int n) {
vector<int>ans;
vector<int>prime(3);
vector<int>location(3,0);
prime[0] = 2;prime[1] = 3;prime[2] = 5;
ans.push_back(1);
for(int i = 1;i < n;i++) {
int mi = 2e9;
for(int j = 0;j < 3;j++) {
while(prime[j] * ans[location[j]] <= ans[i - 1]) location[j]++;
mi = min(mi,prime[j] * ans[location[j]]);
}
ans.push_back(mi);
}
return ans[n - 1];
}
};