题目
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
提示:
1 <= n <= 1690
代码
class Solution {
public:
int nthUglyNumber(int n) {
int ans[n+1];
ans[0] = 1;
int i,j,k,times;
i = j = k =0;
for (times=1;times<=n;times++)
{
ans[times] = min(ans[i]*2,min(ans[j]*3,ans[k]*5));
if (ans[times]==ans[i]*2)//最小的在*2上面取
i++;
if (ans[times]==ans[j]*3)//最小的也在3上面,为了避免重复,这里的值也需要挪一下
j++;
if (ans[times]==ans[k]*5)
k++;
}
return ans[n-1];
}
};
易错点
本题采用了三指针思路动态规划的思路,为了避免在2,3,5的公因数(如:2和3的公因数6)上取值重复,需要对每一个存入ans的值进行判断——是否是2或者3或者*5产生的,如果发现是公因数,都需要让下标加一(对应于以上代码中的三个if并列,进行分别判断)。
错误代码
超时:采用的是递归分解质因数,递归耗时过长。
class Solution {
public:
int isugly(int n,int judge) {
if (n==1)//是丑数
judge = 1;
else{
if (n%2==0)
judge = isugly(n/2,0);
else if (n%3==0)
judge = isugly(n/3,0);
else if (n%5==0)
judge = isugly(n/5,0);
else
judge = 0;
}
return judge;
}
int nthUglyNumber(int n) {
int i = 1;
int num = 2;
if (n==i)
return 1;
while (i!=n){
if (isugly(num,0)==1)
i++;
num++;
}
return (num-1);
}
};