首页 > 第 k 小
头像 神崎兰子
发表于 2025-10-14 11:08:27
第k小 题解 题目描述 给定一个长度为 的数组,初始元素为 。需要支持 次操作: 添加操作:1 x - 向数组添加元素 查询操作:2 - 查询当前数组的第 小元素 如果数组元素少于 个,输出 -1。 示例: 数组 [1,2,2,3,4,6] 的第3小元素是 2。 核心结论 答案: 使用 展开全文
头像 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 展开全文
头像 死于算法,生于算法
发表于 2021-11-08 16:53:53
最开始我的想法是把所有数据都保存在优先队列里,然后每当弹出时就用其他容器接住,然后再放回优先队列中,结果果不其然超时了。 于是看了题解,觉得有道理,可以用大根堆(less)来保存,先将所有数据保存在堆中,如果堆的大小大于k,那么也就是说后面的数据压根不可能成为答案,所以就出队。然后接着进行选择,如果 展开全文
头像 Silencer76
发表于 2025-10-14 10:45:16
优先队列,保证元素数量 。 #include <iostream> #include <queue> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); 展开全文
头像 Infinite_Light
发表于 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. 展开全文
头像 Fss1
发表于 2025-03-21 13:35:15
双堆解法 类似于双堆求中位数 把前k小的数放进大根堆,大根堆的堆顶恰好就是第k小的数 剩下的数放进小根堆里 如果要插入一个x 如果x比大根堆堆顶大,就扔进小根堆不管它了 如果x比大根堆堆顶小,取出大根堆堆顶,把堆顶那个数放进小根堆,再把x放入大根堆 查找的时候,大根堆如果size是k,那么大根堆堆顶 展开全文
头像 TRfirst
发表于 2025-10-14 11:24:03
使用优先队列维护数组中前 小的数。 对于初始化与操作 ,对于每个元素首先 进堆,此时如果 则不用处理,否则当前 ,进行一次 操作一定会弹出当前第 小的元素,可保证堆顶元素仍为第 小。 对于操作 ,如果 代表数组内还没有 个数,输出 ,否则输出堆顶元素即可。 #include < 展开全文
头像 Luo_Saisei
发表于 2025-10-14 13:30:34
#include <bits/stdc++.h> using namespace std; using ll = long long; #define fc freopen("in.in", "r", stdin), freopen("o 展开全文
头像 Feijoa_Li
发表于 2025-10-14 15:46:11
求第k小,可以使用邪教的pbds操作,具体调用方法详见代码。 #include "bits/stdc++.h" /* ________ _______ ___ ___ ________ ________ |\ _____\|\ 展开全文