首页 > 第 k 小
头像 brbrbr
发表于 2022-02-26 01:56:13
类似于求中位数,求中位数是将前一半小的数放入大顶堆,而本题可以前k小的数放入大顶堆中,因此维护大小始终为k的大顶堆即可。 对于准备插入的数 如果size小于k就直接插入 大于等于堆顶就跳过 小于堆顶就踢出当前堆顶,插入 import java.io.*; import java.ut 展开全文
头像 在刷题的单身狗很开心
发表于 2023-09-13 20:22:50
//建立两个堆,一个大根堆,一个小根堆。从K处劈开 #include <bits/stdc++.h> using namespace std; int n, m, k; const int maxn&nb 展开全文
头像 宁宁也要爆wa
发表于 2023-07-11 11:28:35
Ciallo~(∠・ω< )⌒☆,大家好,本蒻蒟的第一篇题解,不喜勿喷。首先这题可以先用设置两个优先队列,一个大根堆p,一个设置成小根堆q,先用大根堆p存储输入数据,再用小根堆q维护前K个数据,当小于等于q的堆顶元素时入队,大于时入怕,最后输出去q的堆顶元素即可。 #include<io 展开全文
头像 CH_cycyc
发表于 2024-12-22 08:04:31
链接:https://ac.nowcoder.com/acm/problem/214362 来源:牛客网 题目描述 有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数。比如 1 2 2 3 4  6 中,第 3 小的数就是2. 展开全文
头像 死于算法,生于算法
发表于 2021-11-08 16:53:53
最开始我的想法是把所有数据都保存在优先队列里,然后每当弹出时就用其他容器接住,然后再放回优先队列中,结果果不其然超时了。 于是看了题解,觉得有道理,可以用大根堆(less)来保存,先将所有数据保存在堆中,如果堆的大小大于k,那么也就是说后面的数据压根不可能成为答案,所以就出队。然后接着进行选择,如果 展开全文
头像 Fss1
发表于 2025-03-21 13:35:15
双堆解法 类似于双堆求中位数 把前k小的数放进大根堆,大根堆的堆顶恰好就是第k小的数 剩下的数放进小根堆里 如果要插入一个x 如果x比大根堆堆顶大,就扔进小根堆不管它了 如果x比大根堆堆顶小,取出大根堆堆顶,把堆顶那个数放进小根堆,再把x放入大根堆 查找的时候,大根堆如果size是k,那么大根堆堆顶 展开全文