zoukankan      html  css  js  c++  java
  • 最小的K个数

    题目

    给你一个数组,求出该数组中最小的K的个数。

    分析

    这种题型是TopK问题,也就是求出数组或者集合中前K大或者前K小的元素。
    有多种解决方法,首先想到的是对数据进行排序,然后取出前k个元素。但是如果数据量很大怎么办?这时候需要使用到堆这种数据结构。我们可以维护一个大小为 K 的小顶堆,顺序遍历数组,从数组中取出数据与堆顶元素比较。如果比堆顶元素小,我们就把堆顶元素删除,并且将这个元素插入到堆中;如果比堆顶元素大,则不做处理,继续遍历数组。这样等数组中的数据都遍历完之后,堆中的数据就是前 K 小的数据了。

    实现

    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
    //        结果集
            ArrayList<Integer> res = new ArrayList<Integer>();
            if(input==null||k>input.length||k<=0){
                return res;
            }
    //        优先级队列就是堆的实现,这里构建的是小顶堆,最小的数是堆顶元素
            Queue<Integer> queue = new PriorityQueue<>(k, Collections.reverseOrder());
            for(int i=0;i<input.length;i++){
    //            如果堆中还有位置就将当前元素放入
                if(queue.size() < k){
                    queue.add(input[i]);
                }else{
                    //放满后,再将当前元素和堆定元素相比,如果当前元素小于堆顶元素,将堆顶元素和当前元素交换,也就是
                    // 移除堆顶元素,当前元素入堆
                    if(input[i]<queue.peek()){
                        queue.remove();
                        queue.add(input[i]);
                    }
                }
            }
            //放入结果集
            while(!queue.isEmpty()){
                res.add(queue.remove());
            }
            return res;
        }
    
  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121819.html
Copyright © 2011-2022 走看看