数据结构笔记--优先队列(大小根堆)经典题型

2024-02-29 07:20

本文主要是介绍数据结构笔记--优先队列(大小根堆)经典题型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1--项目的最大利润

题目描述:

        输入:正数数组 costs,costs[i] 表示项目 i 的花费;正数数组 profits,profits[i] 表示项目 i 的花费;正数 k 表示只能串行完成最多 k 个项目;m 表示拥有的资金,每完成一个项目后资金会立即更新(原始资金 + 利润);

        输出:求解最后获得的最大利润;

主要思路:

        小根堆存储所有项目,大根堆存储可以进行的项目;

        每次从小根堆解锁项目添加到大根堆中,优先做大根堆利润最高的项目;

#include <iostream>
#include <vector>
#include <queue>struct project{project(int c, int p) : cost(c), profit(p) {}int cost;int profit;
};class cmp1{
public:bool operator()(project* a, project* b){return a->cost > b->cost;}
};struct cmp2{bool operator()(project* a, project* b){return a->profit < b->profit;}
};class Solution{
public:int findMaxCapital(int m, int k, std::vector<int> costs, std::vector<int> profits){std::priority_queue<project*, std::vector<project*>, cmp1> minCostQ;std::priority_queue<project*, std::vector<project*>, cmp2> maxProfitQ;// 按cost按从小到大排序项目for(int i = 0; i < profits.size(); i++){minCostQ.push(new project(costs[i], profits[i]));}for(int i = 0; i < k; i++){while(!minCostQ.empty() && minCostQ.top()->cost <= m){// 可以解锁新的项目maxProfitQ.push(minCostQ.top());minCostQ.pop();}if(maxProfitQ.empty()) return m; // 无法解锁新的项目,直接返回// 更新资金m += maxProfitQ.top()->profit;maxProfitQ.pop();}return m;}
};int main(int argc, char *argv[]){int m = 1;int k = 2;std::vector<int> costs = {1, 1, 2, 2, 3, 4};std::vector<int> profits = {1, 4, 3, 7, 2, 10};Solution S1;int res = S1.findMaxCapital(m, k, costs, profits);std::cout << res << std::endl; 
}

2--数据流的中位数

主要思路:

        分别使用大根堆和小根堆存储数据,每添加一个数据,先将数据添加至大根堆,再将数据弹出并添加到小根堆;

        当小根堆值的数量与大根堆值的数量相差 2 时,从小根堆弹出数据添加到大根堆中,保持两个根堆的容量差不超过;

        根据添加数据量是偶数还是奇数,返回对应的中位数;

#include <iostream>
#include <queue>class MedianFinder {
public:MedianFinder() {}void addNum(int num) {maxQ.push(num);minQ.push(maxQ.top());maxQ.pop();if(minQ.size() - maxQ.size() > 1){maxQ.push(minQ.top());minQ.pop();}}double findMedian() {// 奇数if((maxQ.size() + minQ.size()) % 2 != 0) return minQ.top();// 偶数else return( (maxQ.top() + minQ.top()) / 2.0);}
private:std::priority_queue<int, std::vector<int>, std::greater<int>> minQ;std::priority_queue<int, std::vector<int>, std::less<int>> maxQ;
};int main(int argc, char *argv[]){MedianFinder S1;S1.addNum(1);S1.addNum(2);S1.addNum(3);S1.addNum(4);S1.addNum(5);double res = S1.findMedian();std::cout << res << std::endl;
}

这篇关于数据结构笔记--优先队列(大小根堆)经典题型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757972

相关文章

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘