做题博客链接
https://blog.youkuaiyun.com/qq_43349112/article/details/108542248
题目链接
https://leetcode-cn.com/problems/ugly-number-ii/
描述
编写一个程序,找出第 n 个丑数。
丑数就是质因数只包含 2, 3, 5 的正整数。
说明:
1 是丑数。
n 不超过1690。
示例
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
初始代码模板
class Solution {
public int nthUglyNumber(int n) {
}
}
代码
推荐题解:
https://leetcode-cn.com/problems/ugly-number-ii/solution/chou-shu-ii-by-leetcode-solution-uoqd/
优先队列
class Solution {
public int nthUglyNumber(int n) {
PriorityQueue<Long> queue = new PriorityQueue<>();
queue.offer(1L);
Set<Long> set = new HashSet<>();
set.add(1L);
long[] tmp = new long[3];
long cur = 0;
for (int i = 1; i < n; i++) {
cur = queue.poll();
init(tmp, cur);
for (int j = 0; j < tmp.length; j++) {
if (!set.contains(tmp[j])) {
set.add(tmp[j]);
queue.offer(tmp[j]);
}
}
}
cur = queue.poll();
return (int)cur;
}
private void init(long[] tmp, long cur) {
tmp[0] = cur * 2;
tmp[1] = cur * 3;
tmp[2] = cur * 5;
}
}
动态规划
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n + 1];
dp[1] = 1;
//三指针,a对应2,b对应3,c对应5
int a = 1;
int b = 1;
int c = 1;
//三个中间变量
int num1 = 0;
int num2 = 0;
int num3 = 0;
for (int i = 2; i <= n; i++) {
num1 = dp[a] * 2;
num2 = dp[b] * 3;
num3 = dp[c] * 5;
dp[i] = Math.min(Math.min(num1, num2), num3);
if (dp[i] == num1) {
a++;
}
if (dp[i] == num2) {
b++;
}
if (dp[i] == num3) {
c++;
}
}
return dp[n];
}
}