题目
264. 丑数 II
给你一个整数 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
从1开始遍历所有整数,遇到丑数则count++, 直到第n个丑数。不过这种超时了。
java代码1
public int nthUglyNumber(int n) {
if(n <= 1) {
return 1;
}
int count=0;
for(int i=1;;i++) {
if(isUgly(i)) {
count++;
if(count == n) {
return i;
}
}
}
}
private boolean isUgly(int n) {
if(n <= 0) {
return false;
}
int[] factors = new int[]{2,3,5};
for(int i : factors) {
while(n % i == 0) {
n = n/i;
}
}
return n == 1;
}
}
思路2
动态规划思想。后面的丑数一定是由前面的丑数乘以2、3或5得到。所以第n个丑数一定是由前n-1个数中的某3个丑数(分别记为index2、index3、index5)分别乘以2、3或者5得到的数中的最小数,index2,index3,index5有个特点,即分别乘以2、3、5得到的数一定含有比第n-1个丑数大(可利用反证法:否则第n-1个丑数就是它们当中的一个)最小丑数,即第n个丑数由u[index2]*2、u[index3]*3、u[index5]*5中的最小数得出。让它们分别和第n个丑数比较,若和第n个丑数相等,则更新它们的值。注:一次最少更新一个值(如遇到第n个丑数是6时,index2和index3都要更新)。
java代码2
class Solution {
public int nthUglyNumber(int n) {
int[] u = new int[n];
u[0] = 1;
int index2 = 0;
int index3 = 0;
int index5 = 0;
int k=1;
while(k < n) {
u[k] = min (u[index2]*2, u[index3]*3, u[index5]*5);
if(u[k] == u[index2]*2) index2++;
if(u[k] == u[index3]*3) index3++;
if(u[k] == u[index5]*5) index5++;
k++;
}
return u[n-1];
}
private int min(int a, int b, int c) {
return a>b?(b>c?c:b):(a>c?c:a);
}
}