我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
- 1 是丑数。
- n 不超过1690。
class Solution {
public:
//丑数递推规律:丑数只包含因子 2, 3, 5,因此有 “丑数 == 某较小丑数 × 某因子” (例如:10=5×2)。
int nthUglyNumber(int n) {
int dp[n+5]; //每个元素记录第i个丑数
dp[1]=1; //第一个丑数为1
int a=1,b=1,c=1; //记录要乘以2、3、5的当前丑数
for(int i=2;i<=n;i++){
int at=dp[a]*2,bt=dp[b]*3,ct=dp[c]*5;
dp[i]=min(min(at,bt),ct); //找到最小的下一个丑数
if(dp[i]==at) a++; //找到下一个最小丑数后则上一个丑数不能再乘上因子2或3或5
if(dp[i]==bt) b++;
if(dp[i]==ct) c++;
}
return dp[n]; //返回第n个丑数
}
};