Problem
Write a program to find the nth super ugly number.
Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k.
Example:
Input: n = 12,primes=[2,7,13,19]Output: 32 Explanation:[1,2,4,7,8,13,14,16,19,26,28,32]is the sequence of the first 12 super ugly numbers givenprimes=[2,7,13,19]of size 4.
Note:
1is a super ugly number for any givenprimes.- The given numbers in
primesare in ascending order. - 0 <
k≤ 100, 0 <n≤ 106, 0 <primes[i]< 1000. - The nth super ugly number is guaranteed to fit in a 32-bit signed integer.
Code
public class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int len = primes.length;
int[] dp = new int[n];
dp[0] = 1;
Set<Integer> set = new HashSet<Integer>();
set.add(1);
PriorityQueue<Node> queue = new PriorityQueue<Node>(new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o1.getVal() - o2.getVal();
}
});
for (int i = 0; i < len; ++i) {
queue.add(new Node(primes[i], 0, primes[i]));
}
for (int i = 1; i < n; ++i) {
Node node = queue.poll();
//System.out.println(node.getVal());
dp[i] = node.getVal();
int index = node.getIndex() + 1;
int val = dp[index] * node.getBase();
while (set.contains(val)) {
index = index + 1;
val = dp[index] * node.getBase();
}
set.add(val);
queue.add(new Node(val, index, node.getBase()));
}
return dp[n - 1];
}
private class Node {
private int val;
private int index;
private int base;
public Node(int val, int index, int base) {
this.val = val;
this.index = index;
this.base = base;
}
public int getVal() {
return val;
}
public int getIndex() {
return index;
}
public int getBase() {
return base;
}
}
}
1993

被折叠的 条评论
为什么被折叠?



