题解 | #第k小#

第k小

https://ac.nowcoder.com/acm/problem/214362

类似于求中位数,求中位数是将前一半小的数放入大顶堆,而本题可以前k小的数放入大顶堆中,因此维护大小始终为k的大顶堆即可。

对于准备插入的数

  1. 如果size小于k就直接插入

  2. 大于等于堆顶就跳过

  3. 小于堆顶就踢出当前堆顶,插入

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) {
		InputReader in = new InputReader();
		PrintWriter out = new PrintWriter(System.out);
        PriorityQueue<Integer> p = new PriorityQueue<>();
        int n = in.nextInt();
        int m = in.nextInt();
        int k = in.nextInt();
        for(int i = 0; i < n; ++i) {
            int num = in.nextInt();
            if(p.size() < k)
                p.add(-num);
            else if(num < -p.peek()) {
                p.poll();
                p.add(-num);
            }
        }
        for(int i = 0; i < m; ++i) {
            int opr = in.nextInt();
                if(opr == 1) {
                int num = in.nextInt();
                if(p.size() < k)
                    p.add(-num);
                else if(num < -p.peek()) {
                    p.poll();
                    p.add(-num);
                }
            } else out.println(p.size() < k ? -1 : -p.peek());
        }
        
		out.close();
	}
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务