当前位置: 首页 > news >正文

C++ map代码练习 1、2、priority_queue基础概念、对象创建、数据插入、获取堆顶、出队操作、大小操作,自定义结构、代码练习 1 2

map代码练习1,对应力扣 两个数据的交集,代码见下

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {map<int, int> cnt;vector<int> ans;for(int i=0; i<nums1.size(); ++i){int x = nums1[i];cnt[x]++;}for(int i=0; i<nums2.size(); ++i){int x = nums2[i];if(cnt[x] > 0){cnt[x]--;ans.push_back(x);}}return ans;}
};

代码2,对应力扣,合并相似的物品

class Solution {
public:vector<vector<int>> mergeSimilarItems(vector<vector<int>>& items1, vector<vector<int>>& items2) {map<int, int> mp;for(int i=0; i<items1.size(); ++i){int val = items1[i][0];int weh = items1[i][1];mp[val] += weh; }for(int i=0; i<items2.size(); ++i){int val = items2[i][0];int weh = items2[i][1];mp[val] += weh; }vector<vector<int>> ans;for(map<int, int>::iterator it = mp.begin(); it != mp.end(); it++){int val = it->first;int weh = it->second;ans.push_back({val, weh});}return ans;}
};

priority_queue 优先级队列

parent(id) = (id - 1)/2

left(id) = id*2 + 1;

right(id) = id*2 + 2;

堆概念:满足比他的所有子节点大或者小

大顶堆:满足堆的概念(比所有子节点大),并且他的子节点也满足堆的概念(比所有子节点大)

小顶堆:满足堆的概念(比所有子节点小),并且他的子节点呀满足堆的概念(比所有子节点小)

大顶堆的增删查:

1,元素插入:往数组尾部插入一个元素、对插入的元素,比较他(在树形结构中)和他父节点的大小关系,来决定是否和父节点进行交换。这个就是优先队列的入队操作。

2,获取栈顶:获取数组的第0个元素

3,元素删除:把数组的第0个元素和最后有一个元素交换、然后对栈顶的元素不断做“下沉”操作,选择大的进行交换,直到“自己”成为最大的、删除数组的最后一个元素。

容器特点:

线性容器:vector string list

树形容器:set multiset map multimap

线性模拟树:priority_queue

priority_queue对象创建,代码见下

#include<iostream>
#include<queue>using namespace std;int main() {// 最大优先队列priority_queue<int> q1;// 最小优先队列priority_queue<int, vector<int>, greater<int>> q2;return 0;
}

priority_queue 数据插入

插入有一个特点,便是插入后的队列的第零个元素都是当前元素中最大的那个元素(这个队列是最大优先队列)。最小优先队列的话恰恰相反

代码见下:

#include<iostream>
#include<queue>using namespace std;int main() {// 最大优先队列priority_queue<int> q1;q1.push(6);q1.push(2);q1.push(1);q1.push(8); q1.push(16);q1.push(26);q1.push(9);// 最小优先队列priority_queue<int, vector<int>, greater<int>> q2;q2.push(6);q2.push(2);q2.push(1);q2.push(8);q2.push(16);q2.push(26);q2.push(9);return 0;
}

具体调试过程可见下,用于帮助理解:

priority_queue获取栈顶

#include<iostream>
#include<queue>using namespace std;int main() {// 最大优先队列priority_queue<int> q1;q1.push(6); cout << q1.top() << endl;q1.push(2); cout << q1.top() << endl;q1.push(1); cout << q1.top() << endl;q1.push(8); cout << q1.top() << endl;q1.push(16); cout << q1.top() << endl;q1.push(26); cout << q1.top() << endl;q1.push(9); cout << q1.top() << endl;cout << "-----------------------------";// 最小优先队列priority_queue<int, vector<int>, greater<int>> q2;q2.push(6); cout << q2.top() << endl;q2.push(2); cout << q2.top() << endl;q2.push(1); cout << q2.top() << endl;q2.push(8); cout << q2.top() << endl;q2.push(16); cout << q2.top() << endl;q2.push(26); cout << q2.top() << endl;q2.push(9); cout << q2.top() << endl;return 0;
}

这里的top其实便是front,见以下截图

priority_queue 出队操作,代码见下

#include<iostream>
#include<queue>using namespace std;int main() {// 最大优先队列priority_queue<int> q;q.push(6); q.push(2); q.push(1); q.push(8); q.push(16); q.push(26); q.push(9);for (int i = 0; i < 7; ++i) {cout << "top()" << q.top() << endl;q.pop();}return 0;
}

priority_queue 大小操作,代码见下

#include<iostream>
#include<queue>using namespace std;int main() {// 最大优先队列priority_queue<int> q;q.push(6); q.push(2); q.push(1); q.push(8); q.push(16); q.push(26); q.push(9);while (!q.empty()) {cout << "top()" << q.top() << "size()" << q.size() << endl;q.pop();}return 0;
}

priority_queue 自定义结构,代码见下

#include<iostream>
#include<queue>using namespace std;struct type {int key;int value;type() { key = value = 0; };type(int k, int v) :key(k), value(v){};bool operator<(const type& t) const { // 这里的第二个const是确保成员函数不被修改return key < t.key;}
};
int main() {priority_queue<type> q;q.push(type(6, 1));q.push(type(5, 2));q.push(type(4, 2));q.push(type(8, 3));q.push(type(9, 2));while (!q.empty()) {cout << "top() = " << q.top().key << ", size()=" << q.size() << endl;q.pop();}return 0;
}

代码练习一,对应力扣,丑数 || 代码见下

class Solution {#define ll long long
public:int nthUglyNumber(int n) {priority_queue<ll, vector<ll>, greater<ll>> q;q.push(1);ll pre = -1;while(1){ll val = q.top();q.pop();while(val == pre){val = q.top();q.pop();}pre = val;--n;if(n==0){return val;}q.push(val * 2);q.push(val * 3);q.push(val * 5);}return -1;}
};

代码练习 2 对应力扣 矩阵中的和,代码见下

class Solution {
public:int matrixSum(vector<vector<int>>& nums) {int n = nums.size();int m = nums[0].size();priority_queue<int> q[300];for(int i=0; i<n; ++i){for(int j=0; j<m; ++j){q[i].push(nums[i][j]);}}int sum = 0;while(m--){int ret = 1;for(int i=0; i<n; ++i){ret = max(ret, q[i].top());q[i].pop();}sum += ret;}return sum;}
};

http://www.lryc.cn/news/571404.html

相关文章:

  • 电机及驱动器的安全、性能和能效认证
  • 02 ( chrome 浏览器插件, 立马翻译), 搭建本地 api
  • c++学习-多态
  • MacOS上MySQL的安装以及使用
  • 【编译工具】CodeRider 2.0:驭码 CodeRider 2.0 产品功能分析
  • 【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(软件篇)(二)
  • RK 安卓10/11平台 HDMI-IN 调试
  • RAG轻松通-P1:分块
  • 爬虫技术:数据获取的利器与伦理边界
  • 输电线路电缆护层环流在线监测装置:原理、优势与应用解析
  • Elasticsearch/OpenSearch MCP Quickstart
  • 日本生活:日语语言学校-日语作文-沟通无国界(2):回忆深刻的生日
  • threejs webVR获取相机正前方向量
  • 【保姆级】讯飞ROS智能车 Debian系统 U盘克隆/恢复教程
  • Spring Boot启动流程深度解析(源码级剖析)
  • 键盘动作可视化技术浅析:如何做到低延迟显示
  • word如何插入高清晰的matlab绘图
  • 【数据分析三:Data Storage】数据存储
  • Kafka数据写入流程源码深度剖析(Broker篇)
  • Python训练营打卡Day50
  • Linux网络配置工具ifconfig与ip命令的全面对比
  • 游戏技能编辑器之状态机的设计与实现
  • 攻防世界[level7]-Web_php_wrong_nginx_config
  • 一次生产故障引发的JVM垃圾回收器选型思考:彻底掌握垃圾回收原理及通用配置!
  • 在 Java 中操作 Map时,高效遍历和安全删除数据
  • Arrays.asList() 的不可变陷阱:问题、原理与解决方案
  • FPGA 43 ,UDP 协议详细解析( FPGA 中的 UDP 协议 )
  • 升级OpenSSL和OpenSSH 修复漏洞
  • 多组件 flask 项目
  • 数据库新选择?KingbaseES在线体验详解