30KLeastNumbers(最小的K个数)

最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

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

/**
 * @author LemonLin
 * @Description :KLeastNumbers30
 * @date 2018/4/12-16:20
 *
 * 算法思想就是利用大顶堆保存最小的四个数
 * 如果没有存满,就继续存入,如果存满了,就和堆顶元素进行比较,如果堆顶元素小的话,不处理
 * 如果堆顶元素大的话,就把堆顶删除,并且入堆进行调整。
 * 最后输出堆中的元素即可
 *
 *
 * 难点在于怎么建立大顶堆,Java中这个PriorityQueue是小顶堆,可以以下操作,就变成大顶堆
 * private static final int DEFAULT_INITIAL_CAPACITY = 11;
    PriorityQueue<Integer> maxHeap=new PriorityQueue<Integer>(DEFAULT_INITIAL_CAPACITY, new Comparator<Integer>() {
        @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
    });
 */
public class KLeastNumbers30 {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {

        //牛客网返回参数为arrayList,所以需要新建一个arrayList来存储数据;
        ArrayList<Integer> arrayList = new ArrayList<Integer>();

        //判断非法的输入
        if(input.length<k||k==0){
            return arrayList;
        }

        //创建一个大顶堆
        PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(4, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });


        for (int i=0;i<input.length;++i){
            if (maxHeap.size()<k){
                maxHeap.add(input[i]);
            }else if (maxHeap.peek()>input[i]){
                maxHeap.remove();
                maxHeap.add(input[i]);
            }
        }

        //把堆中的已经是最小的k个元素放入到arrayList中去;
        //注意因为这里maxHeap中有迭代器,所以可以使用下面的写法
        for (Integer integer:maxHeap){
            arrayList.add(integer);
        }
        return arrayList;
    }

    public static void main(String[] args) {
        int [] array={4,5,1,6,2,7,3,8};
        KLeastNumbers30 kLeastNumbers30 = new KLeastNumbers30();
        ArrayList<Integer> arrayList = kLeastNumbers30.GetLeastNumbers_Solution(array, 4);
        for(Integer integer : arrayList){
            System.out.println(integer);

        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值