小根堆+一个栈(可换成数组)
第k个数
http://www.nowcoder.com/questionTerminal/d5e776441a6e41ae9f9859413bdc1eca
三个小根堆。
每个堆中维护3/5/7的乘数。
代码较长。但重复代码很多。
import java.util.*;
public class KthNumber {
public int findKth(int k) {
// write code here
PriorityQueue<Integer> queue3 = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return integer - t1;
}
});
PriorityQueue<Integer> queue5 = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return integer - t1;
}
});
PriorityQueue<Integer> queue7 = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return integer - t1;
}
});
queue3.offer(3);
queue5.offer(5);
queue7.offer(7);
Stack<Integer> stack = new Stack<>();
stack.push(0);
if(k == 0) return 0;
int i = 0;
while(i++<k){
int temp = stack.peek();
while (queue3.peek() <= temp) queue3.poll();
while (queue5.peek() <= temp) queue5.poll();
while (queue7.peek() <= temp) queue7.poll();
int a = queue3.peek();
int b = queue5.peek();
int c = queue7.peek();
int min = Math.min(a, Math.min(b,c));
if(a == min){
int p = a * 3;
int q = a * 5;
int z = a * 7;
queue3.offer(p);
queue3.offer(q);
queue3.offer(z);
queue3.poll();
}else if(b == min){
int p = b * 3;
int q = b * 5;
int z = b * 7;
queue5.offer(p);
queue5.offer(q);
queue5.offer(z);
queue5.poll();
}else if(c == min){
int p = c * 3;
int q = c * 5;
int z = c * 7;
queue7.offer(p);
queue7.offer(q);
queue7.offer(z);
queue7.poll();
}
stack.push(min);
}
return stack.peek();
}
}