题目描述:
- 给一个整数n,找出并返回 第 n 个 丑数。
- 丑数 就是 只包含质因数 2、3 和/或 5 的正整数。
示例一:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例二:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
来源:力扣(LeetCode)
题解:
官方题解
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n + 1];
dp[1] = 1; //丑数数组中第一个丑数1
int p2 = 1, p3 = 1, p5 = 1; //设置三个指针
for (int i = 2; i <= n; i++) {
int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
//×2、3、5 比较大小
dp[i] = Math.min(Math.min(num2, num3), num5);
//添加到数组的数字如果和 num_ 相等,此处丑数×对应数字已添加。指针可以移到下一个位置
if (dp[i] == num2) {
p2++;
}
if (dp[i] == num3) {
p3++;
}
if (dp[i] == num5) {
p5++;
}
}
return dp[n];
}
}
丑数:丑数是由 【(0 ~ 无穷个) 2 ✖ (0 ~ 无穷个) 3 ✖ (0 ~ 无穷个) 5】得到的。
例如:【2:一个2,0个3和5】,【9:2个3,0个2和5】,【10:一个2,一个5,0个3】
所以一个丑数乘以 2 / 3 / 5 一定是丑数。
1)数组中第一个丑数是1。
2)一个丑数 ×2、3、5 都会产生一个新的丑数。
3)为了可以从小到大的将丑数添加到数组中,可以将已有的丑数 ×2、3、5 然后再比较大小后添加到数组中。
4)初始数组【1】1×2、3、5比较后,2会被添加到数组中,数组变成【1,2】,此时添加下一个丑数时是 2×2 和 1×3、1×5比较,【所以应该设置三个指针用于指示2、3、5分别该 × 数组【?】】,乘过就+1。即代码中的if (dp[i] == num2) p2++;