编写一个程序,找出第 n
个丑数。
丑数就是只包含质因数 2, 3, 5
的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1
是丑数。n
不超过1690。
思路:每一个丑数都是之前的丑数×2,或者×3,或者×5得到的。因此我们可以将丑陋数序列可以拆分为下面3个子列表,每次选取其中最小的那一个。
1、对于没有被选到的丑数,继续保留。
2、对于被选到的丑数,通过乘以丑数列表中的下一个丑数, 来更新该丑数。
丑数子列表如下:
(1) 1x2, 2x2, 2x2, 3x2, 3x2, 4x2, 5x2...
(2) 1x3, 1x3, 2x3, 2x3, 2x3, 3x3, 3x3...
(3) 1x5, 1x5, 1x5, 1x5, 2x5, 2x5, 2x5...
1, 2, 3, 4, 5, 6, 8, 9
class Solution {
public:
int nthUglyNumber(int n) {
vector<int>re(n,1);
int t2=0, t3=0, t5=0;
for(int i=1; i<n; ++i){
re[i]=min(re[t2]*2, min(re[t3]*3, re[t5]*5));
if(re[i]==re[t2]*2) t2++;
if(re[i]==re[t3]*3) t3++;
if(re[i]==re[t5]*5) t5++;
}
return re[n-1];
}
};