zoukankan      html  css  js  c++  java
  • Top K

    https://blog.csdn.net/wufaliang003/article/details/82940218

    https://blog.csdn.net/hefenglian/article/details/81807527

    选择最大的K个数

    用PriorityQueue默认是自然顺序排序,要选择最大的k个数,构造小顶堆,每次取数组中剩余数与堆顶的元素进行比较,如果新数比堆顶元素大,则删除堆顶元素,并添加这个新数到堆中。

    public class findTopK {
    
        //找出前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);
                }
            }
    
            int[] result = new int[k];
            for (int i = 0; i < k&&!pq.isEmpty(); i++) {
                result[i] = pq.poll();
            }
            return result;
        }
    
     public static void main(String[] args) {
            int[]arr=new int[]{1, 6, 2, 3, 5, 4, 8, 7, 9};
            System.out.println(Arrays.toString(findKMax( arr,5)));
        }
    }
    /**
    输出:[5, 6, 7, 8, 9]
    */

    选择最小的K个数

    选择最小的k个数可以用冒泡排序,复杂度为O(n*k),有点高。
    要选择最小的K个数使用大顶堆,每次取数组中剩余数与堆顶的元素进行比较,如果新数比堆顶元素小,则删除堆顶元素,并添加这个新数到堆中。

    public class findTopK {
    
        ////要找前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;
        }
    
        public static void main(String[] args) {
            int[]arr=new int[]{1, 6, 2, 3, 5, 4, 8, 7, 9};
            System.out.println(Arrays.toString(findKMin( arr,5)));
        }
    
    }
    /**
    输出:[5, 4, 3, 2, 1]
    */
  • 相关阅读:
    elasticsearch
    CentOS6.9安装Logstash
    CentOS6.9安装Filebeat监控Nginx的访问日志发送到Kafka
    openresty capture
    CentOS6.9安装socat
    CentOS挂Windows的NFS备忘
    openCV 备忘
    rabbitmq更换数据文件和日志文件的存放位置
    根据某个文件或文件夹自制rpm包
    checkinstall打包工具使用
  • 原文地址:https://www.cnblogs.com/dingpeng9055/p/11712221.html
Copyright © 2011-2022 走看看