题目描述:
我们把只包含质因子 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();
}
};
本文详细解析了一种高效求解第N个丑数的算法,丑数定义为仅包含质因子2、3和5的正整数。通过动态规划方法,使用三个指针分别指向乘以2、3、5的丑数,逐步生成丑数序列直至找到第N个。此方法适用于编程竞赛和面试题目,对于理解动态规划思想有很好的帮助。
780

被折叠的 条评论
为什么被折叠?



