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]
 */
欢迎交流指正~

京公网安备 11010502036488号