1. 题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/aea20045f4fb4f50bc7e2aead7a651ef.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Zi_6LSi57un57ut5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. 思路
(1) 动态规划
- 根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。
- 因此,第n个丑数应该是前n-1个丑数中,乘以2、3或者5的结果中,大于第n-1个丑数且最小的一个。
- 设置三个指针,分别指向当前乘以2、乘以3、乘以5的丑数的下标,初始均为0,每次计算时取三个结果中最小的一个作为下一个丑数,并将其下标向后移一位,如果出现多个结果相等的情况,则相等结果的下标均向后移一位。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int nthUglyNumber(int n) {
if (n == 1) {
return 1;
}
int[] dp = new int[n];
dp[0] = 1;
int p2 = 0;
int p3 = 0;
int p5 = 0;
int v2;
int v3;
int v5;
for (int i = 1; i < n; i++) {
v2 = dp[p2] * 2;
v3 = dp[p3] * 3;
v5 = dp[p5] * 5;
dp[i] = Math.min(v2, Math.min(v3, v5));
if (v2 == dp[i]) {
p2++;
}
if (v3 == dp[i]) {
p3++;
}
if (v5 == dp[i]) {
p5++;
}
}
return dp[dp.length - 1];
}
}