class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
if (n == 1) return 1;
int[] a = new int[n];
a[0] = 1;
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
for (int i = 0; i < primes.length; i ++) {
pq.add(new int[]{primes[i], i, 0});
}
for (int i = 1; i < n; i ++) {
int[] tmp = pq.poll();
a[i] = tmp[0];
tmp[0] = primes[tmp[1]] * a[++ tmp[2]];
pq.add(tmp);
if (a[i] == a[i - 1]) i --;
}
return a[n - 1];
}
}
class Solution {
public int nthUglyNumber(int n) {
int[] primes = new int[]{2, 3, 5};
if (n == 1) return 1;
int[] a = new int[n];
a[0] = 1;
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
for (int i = 0; i < primes.length; i ++) {
pq.add(new int[]{primes[i], i, 0});
}
for (int i = 1; i < n; i ++) {
int[] tmp = pq.poll();
a[i] = tmp[0];
tmp[0] = primes[tmp[1]] * a[++ tmp[2]];
pq.add(tmp);
if (a[i] == a[i - 1]) i --;
}
return a[n - 1];
}
}
方法二
class Solution {
public int nthUglyNumber(int n) {
if (n == 1) return 1;
int[] a = new int[n];
a[0] = 1;
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
pq.add(2);
pq.add(3);
pq.add(5);
for (int i = 1; i < n; i ++) {
int tmp = pq.poll();
while (!pq.isEmpty() && pq.peek() == tmp) {
pq.poll();
}
if (tmp <= Integer.MAX_VALUE / 2) pq.add(tmp * 2);
if (tmp <= Integer.MAX_VALUE / 3) pq.add(tmp * 3);
if (tmp <= Integer.MAX_VALUE / 5) pq.add(tmp * 5);
if (tmp > a[i - 1]) {
a[i] = tmp;
} else {
i --;
}
}
return a[n - 1];
}
}