Top K问题。实现堆的,最小(或者最大)的10个数。
思路:(堆或快排)
最小Top K
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
public class test006 {
public static void main(String[] args) {
int[]arr=new int[]{1, 7, 2, 11, 5, 25, 8, 10, 9, 13, 15, 17, 23, 34, 45};
System.out.println(Arrays.toString(findKMin( arr,10)));
}
////要找前k个最小数,则构建大顶堆,要重写compare方法
public static int[] findKMin(int[] nums, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<>(k, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } }); for (int num : nums) { if (pq.size() < k) { pq.offer(num); } else if (pq.peek() > num) {//如果堆顶元素 > 新数,则删除堆顶,加入新数入堆 pq.poll(); pq.offer(num); } } int[] result = new int[k]; for (int i = 0; i < k&&!pq.isEmpty(); i++) { result[i] = pq.poll(); } return result; }
}
/**
输出:[15, 13, 11, 10, 9, 8, 7, 5, 2, 1]
*/
最大Top K
import java.util.Arrays;
import java.util.PriorityQueue;
public class test006 {
public static void main(String[] args) {
int[]arr=new int[]{1, 7, 2, 11, 5, 25, 8, 10, 9, 13, 15, 17, 23, 34, 45};
System.out.println(Arrays.toString(findKMax( arr,10)));
}
//找出前k个最大数,采用小顶堆实现
public static int[] findKMax(int[] nums, int k) {
PriorityQueue<integer> pq = new PriorityQueue<>(k);//队列默认自然顺序排列,小顶堆,不必重写compare
for (int num : nums) {
if (pq.size() < k) {
pq.offer(num);
} else if (pq.peek() < num) {//如果堆顶元素 < 新数,则删除堆顶,加入新数入堆
pq.poll();
pq.offer(num);
}
}</integer>
int[] result = new int[k]; for (int i = 0; i < k&&!pq.isEmpty(); i++) { result[i] = pq.poll(); } return result; }
}
/**
输出:[9, 10, 11, 13, 15, 17, 23, 25, 34, 45]
*/
欢迎交流指正~