题目
编写一个程序,找出第 n 个丑数。
丑数就是质因数只包含 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
分析
dp(n)表示第n个丑数,p1,p2,p3记录分别乘2,3,5位置,将乘2,3,5后的最小的数放在i的位置dp(i),如果i位置的数等于乘几的数,则乘几的位置后移一位,这样遍历n次即可得出结果。
代码
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n+1,0);//dp(n)表示第n个丑数
dp[1]=1;
int p1=1,p2=1,p3=1;//记录分别乘2,3,5位置
for(int i=2;i<=n;i++)
{
dp[i]=min(min(dp[p1]*2,dp[p2]*3),dp[p3]*5);//将乘2,3,5后的最小的数放在i的位置
if(dp[i]==dp[p1]*2)//如果i位置的数等于乘3的数,则乘3的位置后移一位
{
p1++;
}
if(dp[i]==dp[p2]*3)//如果i位置的数等于乘2的数,则乘2的位置后移一位
{
p2++;
}
if(dp[i]==dp[p3]*5)//如果i位置的数等于乘5的数,则乘5的位置后移一位
{
p3++;
}
}
return dp[n];
}
};
备注
1.i是从2开始的