【一次过】【PriorityQueue】【2017好未来】n个数里最小的k个

找出n个数里最小的k个

输入描述:

每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n
不超过100。

输出描述:

输出n个整数里最小的k个数。升序输出

示例1

输入

3 9 6 8 -10 7 -11 19 30 12 23 5

输出

-11 -10 3 6 7

解题思路:

使用Priority即可。为了保证更高的拓展性,本题采用固定大小的最大堆堆进行输入,然后逆序输出即可。

注意维护好固定最大堆的性质!

import java.util.*;

public class Main {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        List<Integer> list = new ArrayList<>();
        String[] strs = sc.nextLine().split(" ");
        for(String str : strs)
            list.add(Integer.parseInt(str));

        int num = list.get(list.size() - 1);
        PriorityQueue<Integer> queue = new PriorityQueue<>(11, Collections.reverseOrder());
        for(int i=0; i<list.size()-1; i++){
            if(queue.size() < num)
                queue.offer(list.get(i));
            else{
                if(list.get(i) > queue.peek())
                    continue;
                
                queue.poll();
                queue.offer(list.get(i));
            }
        }

        Stack<Integer> stack = new Stack<>();
        while(!queue.isEmpty()){
            stack.push(queue.poll());
        }

        for(int i=0; i<num-1; i++)
            System.out.print(stack.pop() + " ");
        System.out.print(stack.pop());
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值