题目描述:
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
方法1:
主要思路:
(1)先处理特殊的情形;
(2)使用动态规划,使用三个指针分别指向乘以因数2,3,5进行增大的数字的索引;
(3)在三个数字中选择最小的一个,作为当前的数字,然后根据选择的数字,对三个索引进行扩大;
class Solution {
public:
int nthUglyNumber(int n) {
if(n<7){
return n;
}
vector<int> dp(n,0);
dp[0]=1;
//三个指针,分别指向其增大的因子的方式
int two=0;
int three=0;
int five=0;
for(int i=1;i<n;++i){
//通过三个索引指向的数字,进行变大的话,可以获得数字
int n2=dp[two]*2;
int n3=dp[three]*3;
int n5=dp[five]*5;
//选择最小的一个作为当前值
dp[i]=min(n2,min(n3,n5));
//对应的更新索引,注意不要用if else,因为可能出现相等的数字
if(dp[i]==n2){
++two;
}
if(dp[i]==n3){
++three;
}
if(dp[i]==n5){
++five;
}
}
return dp.back();
}
};