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

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

相关文章

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<