剑指offer 最小的K个数

基本思路

Top K问题。动态维护一个有K个数的大顶堆,每次将数组中的元素与堆顶比较,即与这K个数中的最大数比,若小于这个最大数,则就有资格进入最小的K个数的行列,用该数组元素替换掉堆顶元素,同时进行下沉的堆调整过程;否则,就什么也不做,继续将数组中下一个数与堆顶元素比较。遍历完该数组后,堆中的K个数即为最小的K个数,输出堆即可。堆直接采用优先级队列PriorityQueue来实现的。


AC代码(Java)

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;


public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> r=new ArrayList<Integer>();
        
        if(input==null || input.length==0 || k<=0 || k>input.length){
            return r;
        }
        PriorityQueue<Integer> q=new PriorityQueue<Integer>(k, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
        }
});
        for(int i=0; i<input.length; i++){
            if(q.size()<k){
                q.offer(input[i]);
            }else{
                if(q.peek()>input[i]){
                    q.poll();
                    q.offer(input[i]);
                }
            }
        }
        for(Integer num : q){
            r.add(num);
        }
        return r;
    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325324240&siteId=291194637