算法知识-堆相关知识

一.对顶堆

1.作用

可以动态维护一个序列上第 k 大的数,k 值会发生变化。比写 线段树 或 BST 简单。

2.算法思想

对顶堆由一个大根堆与一个小根堆组成,小根堆维护前 k 大的数(包含第 k 个,小根堆装大的数),大根堆维护比第 k 大数小的数(大根堆装小的数)

  1. 插入:若插入的元素 ≥ 小根堆堆顶元素,则将其插入小根堆,否则将其插入大根堆。
  2. 维护:当小根堆的大小 > k 时,不断将小根堆堆顶元素取出并插入大根堆,直到小根堆的大小等于 k;
    当小根堆的大小 < k 时,不断将大根堆堆顶元素取出并插入小根堆,直到小根堆的大小等于 k。
  3. 查询第 k 大元素:小根堆堆顶元素。
  4. 删除第 k 大元素:删除小根堆堆顶元素。

D - Chalkboard Median

题意:给你一个数x,之后每次固定向里面加入两个数字,之后每次求这个序列的中位数

解题思路:

这是动态求第k大的问题,我们使用对顶堆

cpp 复制代码
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
class DuiDing {
private:
    // 大根堆:存较小的那一半数
    priority_queue<int> big;
    // 小根堆:存较大的那一半数(前 k 大)
    priority_queue<int, vector<int>, greater<int>> small;

public:
    // 插入单个元素
    void insert(int x, int k) {
        // 1. 决定放入哪个堆
        // 注意:如果 small 为空,或者 x 比 small 的堆顶大(或相等),放入 small
        if (small.empty() || x >= small.top()) {
            small.push(x);
        }
        else {
            big.push(x);
        }

        // 2. 平衡两个堆的大小
        // 情况 A: small 里的数太多了(超过了 k 个),把最小的移给 big
        while (small.size() > k) {
            big.push(small.top());
            small.pop();
        }

        // 情况 B: small 里的数太少了(不足 k 个),且 big 里有货,把最大的移给 small
        //  判断,防止空指针异常
        while (small.size() < k && !big.empty()) {
            small.push(big.top());
            big.pop();
        }
    }

    // 获取第 k 大
    // 增加了一个安全检查,防止在元素不足 k 个时访问空堆
    int get_k() {
        if (small.empty()) return -1; // 或者抛出异常
        return small.top();
    }
};

int main() {
	int x; cin >> x;
	int q; cin >> q;
	DuiDing d;
	
	int cnt = 1;
    d.insert(x, 1);
    while (q--) {
		vector<int>num(2);
        int a, b; cin >> a >> b;
		d.insert(a, ++cnt);
        d.insert(b, cnt);
		cout << d.get_k()<<'\n';
	}

	return 0;
}
相关推荐
宸津-代码粉碎机1 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
chenbingjie_c1 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
噢,我明白了2 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅2 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
专注仿真2 小时前
ACM算法
算法·深度优先
考虑考虑2 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1113 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383003 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
Escalating_xu3 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
实心儿儿3 小时前
Qt — Qt 事件
开发语言·qt