优先级队列(堆)

目录

leetcode题目

一、数组中两元素的最大乘积

二、最后一块石头的重量

三、数据流中的第 K 大元素

四、前K个高频元素

五、前K个高频单词

六、数据流的中位数

七、有序矩阵中的第K小的元素

八、根据字符出现频率排序


leetcode题目

一、数组中两元素的最大乘积

1464. 数组中两元素的最大乘积 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-product-of-two-elements-in-an-array/1.题目解析

求数组中最大的两个元素top1, top2, 返回(top1-1)*(top2-1)

2.算法分析

遍历数组,放入优先级队列中,pop出最大的两个元素,求结果即可

3.算法代码

class Solution {
public:int maxProduct(vector<int>& nums) {priority_queue<int> q;for(auto x : nums)q.push(x);int top1 = q.top();q.pop();int top2 = q.top();q.pop();return (top1-1) * (top2-1);}
};

二、最后一块石头的重量

1046. 最后一块石头的重量 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/last-stone-weight/description/1.题目解析

每次选取最重的两块石头,两两碰撞,重量小的粉碎,重量大的石头剩余重量为原始重量-重量小的石头的重量,最终如果剩一块石头,就返回该石头的重量;如果没有剩石头,就返回0

2.算法分析

用堆(优先级队列) 模拟即可

3.算法代码

class Solution {
public:int lastStoneWeight(vector<int>& stones){priority_queue<int> heap; //默认大堆for(auto x : stones)heap.push(x);while(heap.size() > 1){int a = heap.top();heap.pop();int b = heap.top();heap.pop();if(a > b) heap.push(a-b);}return heap.size() == 1 ? heap.top() : 0;}
};

三、数据流中的第 K 大元素

703. 数据流中的第 K 大元素 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/kth-largest-element-in-a-stream/1.题目解析

实现一个类, 返回给定数组的第K大元素(排序之后的)(不断新增数据)

2.算法分析

典型的top-k问题,用优先级队列来解决~

详见博客: 独树一帜的完全二叉树---堆-CSDN博客

3.算法代码

class KthLargest {
public:KthLargest(int k, vector<int>& nums) {_k = k;for(auto x : nums){heap.push(x); //小堆if(heap.size() > _k) heap.pop();}}int add(int val) {heap.push(val);if(heap.size() > _k) heap.pop();return heap.top();}
private:priority_queue<int, vector<int>, greater<int>> heap; //小堆int _k;
};

四、前K个高频元素

347. 前 K 个高频元素 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/top-k-frequent-elements/1.题目解析

给定一个数组,返回该数组中出现次数最多的k个元素, 顺序任意

2.算法分析

典型的top-k问题,不过求的不是前K大的元素或前K小的元素,而是求前K个出现次数最多的元素,因此我们先用哈希表绑定每个元素和其出现的次数;然后定义优先级队列, 每个元素类型是pair<int, int> (传仿函数指定比较规则,按照pair中的second也就是元素次数进行比较,由于求的是出现次数最多的k个单词,因此建小堆), 最后从优先级队列中提取结果即可

3.算法代码

class Solution {
public:typedef pair<int, int> PII;struct cmp{bool operator()(const PII& p1, const PII& p2){return p1.second > p2.second; //小堆比较规则}};vector<int> topKFrequent(vector<int>& nums, int k) {//1.哈希表统计次数unordered_map<int, int> hash; //单词-次数for(auto& e : nums)hash[e]++;//2.Top-K的主逻辑priority_queue<PII, vector<PII>, cmp> heap;for(auto& pii : hash){heap.push(pii);if(heap.size() > k) heap.pop();}//3.提取结果vector<int> ret(k);for(int i = k-1; i >= 0; i--){ret[i] = heap.top().first;heap.pop();}return ret;}
};

五、前K个高频单词

692. 前K个高频单词 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/top-k-frequent-words/1.题目解析

返回前k个出现次数最多的单词,如果出现频次相同,按照字典序从小到大排列

2.算法分析

同样是top-k问题,但是比较规则有所变化,在priority_queue中传递仿函数指定比较规则即可~

仿函数博客: stack 与 queue 与 priority_queue 与 仿函数 与 模板进阶-CSDN博客

1.哈希表统计单词出现次数

2.创建大小为k的堆

比较规则:

①单词频次不同时,由于频次高的往前排,因此创建小根堆

②单词频次相同时,谁的字典序小谁往前排,因此创建大根堆

3. top-K的主逻辑

4. 提取结果(注意在vector中存放的顺序)

3.算法代码

class Solution {typedef pair<string, int> PSI;struct cmp{bool operator()(const PSI& a, const PSI& b) {if(a.second == b.second) //频次相同,字典序按照大根堆的方式排列return a.first < b.first;return a.second > b.second;}};
public:vector<string> topKFrequent(vector<string>& words, int k) {//1.哈希表统计单词频次unordered_map<string, int> hash;for(auto& s : words)hash[s]++;//2.创建大小为k的堆priority_queue<PSI, vector<PSI>, cmp> heap; //3.top-k主逻辑for(auto& psi : hash){heap.push(psi);if(heap.size() > k) heap.pop();    }//4.提取结果vector<string> ret(k);for(int i = k - 1; i >= 0; i--){ret[i] = heap.top().first;heap.pop();}return ret;}
};

六、数据流的中位数

295. 数据流的中位数 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/find-median-from-data-stream/description/1.题目解析

实现一个类,求数据流的中位数(不断新增数据), 奇数个元素返回中位数,偶数个元素返回中间两个数的平均值

2.算法分析

大小堆维护数据流的中位数

1.当 m == n, 中位数就是两个堆的堆顶元素的平均值

2.当 m == n + 1, 中位数就是大根堆的堆顶元素

细节问题: add()函数, 插入num元素

1. m == n

1.1 num <= x 或 m == 0, 此时进入大根堆,  m == n + 1

1.2 num > x, 进入小根堆, 此时 n = m + 1, 因此我们需要调整, 只需要把小根堆的堆顶元素挪到大根堆的堆顶即可~

2. m == n+1

2.2 num <= x, 此时进入大根堆,  m == n + 2, 因此我们需要调整, 只需要将大根堆的堆顶元素挪到小根堆的堆顶即可~

2.2 num > x, 此时进入小根堆,  m == n

3.算法代码

class MedianFinder {
public:MedianFinder() {}void addNum(int num) {if(left.size() == right.size()){if(left.empty() || num <= left.top())left.push(num);else{right.push(num);left.push(right.top());right.pop();}}else{if(num <= left.top()){left.push(num);right.push(left.top());left.pop();}elseright.push(num);}}double findMedian() {if(left.size() == right.size())return (left.top() + right.top()) / 2.0;else   return left.top();}
private:priority_queue<int> left; //大根堆priority_queue<int, vector<int>, greater<int>> right; //小根堆
};

七、有序矩阵中的第K小的元素

378. 有序矩阵中第 K 小的元素 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/1.题目解析

求矩阵中第K小的元素

2.算法分析

优先级队列

3.算法代码

class Solution {
public:int kthSmallest(vector<vector<int>>& matrix, int k) {priority_queue<int> heap;int m = matrix.size(), n = matrix[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){heap.push(matrix[i][j]);if(heap.size() > k) heap.pop();}}return heap.top();}
};

八、根据字符出现频率排序

451. 根据字符出现频率排序 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/sort-characters-by-frequency/1.题目解析

把出现频率高的字符排在前面, 输出新的字符串

2.算法分析

优先级队列

3.算法代码

class Solution {typedef pair<char, int> PCI;
public:struct cmp{bool operator()(const PCI& p1, const PCI& p2){return p1.second < p2.second; //大堆}};string frequencySort(string s) {//1.哈希表统计频次unordered_map<char, int> hash;for(auto ch : s)hash[ch]++;//2.top-k的主逻辑priority_queue<PCI, vector<PCI>, cmp> heap;for(auto pci : hash)heap.push(pci);//3.提取结果string ret;while(!heap.empty()){auto top = heap.top();for(int i = 0; i < top.second; i++)ret += top.first;heap.pop();}return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/327789.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20【Aseprite 作图】画岩石

1 画一个岩石的框架,不是一个正规的圆,可以把最高点不放在中心,会显得自然 2 用油漆桶填满框架 3 要改变岩石的颜色,可以调整HSV里面的S,降低饱和度 4 描边,和地面连接处可以不描边 5 颜色调得更浅一点,(通过HSV里面的S可以做到),作为亮处的轮廓; 通过把透明度调…

探索智慧生活:百度Comate引领人工智能助手新潮流

文章目录 百度Comate介绍1. 什么是百度Comate&#xff1f;主要特点 2. Comate的核心功能智能问答功能语音识别功能语音助手功能个性化服务 3. Comate 支持哪些语言&#xff1f; 使用教程(以vscode为例)1. 下载和安装Comate3. 常用操作快捷键(windows) 使用体验自然语言生成代码…

【联通支付注册/登录安全分析报告】

联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

未授权访问:ZooKeeper 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章&#xff1a; 这里附上大…

多格式兼容的在线原型查看:Axure RP的便捷解决方案

Axure rp不仅可以绘制详细的产品构思&#xff0c;还可以在浏览器中生成html页面&#xff0c;但需要安装插件才能打开。安装Axure后 rpchrome插件后&#xff0c;还需要在扩展程序中选择“允许访问文件网站”&#xff0c;否则无法在Axure中成功选择 rp在线查看原型。听起来很麻烦…

讲解SSM的xml文件

概述&#xff1a;这些配置文件很烦&#xff0c;建议直接复制粘贴 springMVC.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

51 单片机[2-2]:LED闪烁

摘要&#xff1a; 本文使用STC89C52RC单片机实现单个LED闪烁 新建一个项目&#xff0c;具体步骤见[2-1] 分析&#xff1a; 要使 LED 闪烁&#xff08;以D1为例&#xff09;&#xff0c;就要先让 P2 0xfe; 再让 P2 0xff; 先在keil5中把程序写成这样&#xff1a; #include &…

Spring Boot:异常处理

Spring Boot 前言使用自定义错误页面处理异常使用 ExceptionHandler 注解处理异常使用 ControllerAdvice 注解处理异常使用配置类处理异常使用自定义类处理异常 前言 在 Spring Boot 中&#xff0c;异常处理是一个重要的部分&#xff0c;可以允许开发者优雅地处理应用程序中可…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

2022-1990年 各省碳排放Co2数据集(含数据及参考文献)

碳排放是指人类活动产生的二氧化碳&#xff08;CO2&#xff09;等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想&#xff0c;由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想&#xff0c;可分为3…

SQL语句

约束具体表现在表的层面&#xff0c;属性具体表现在字段的层面。 1.SQL语句的类型 根据作用进行分类&#xff1a; DDL 数据定义语言 create&#xff0c;drop&#xff0c;alter DML 数据操作语言&#xff08;对数据本身做操作&#xff0c;增删改查&#xff09; insert&am…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

答辩PPT制作成本高?推荐3个aippt工具

这些网站我愿称之为制作答辩PPT的神&#xff01; 很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT…

PG pageinspect使用与块空间清理学习

1.创建有时候会报错 ERROR: could not open extension control file "/usr/local/pgsql/share/extension/pageinspect.control": No such file or directory 解决方案&#xff1a; 2.使用 PostgreSQL中&#xff0c;对于每一行数据&#xff08;称为一个tuple&#…

JavaScript异步编程——10-async异步函数【万字长文,感谢支持】

异步函数&#xff08;用 async 声明的函数&#xff09; 异步函数的定义 使用async关键字声明的函数&#xff0c;称之为异步函数。在普通函数前面加上 async 关键字&#xff0c;就成了异步函数。语法举例&#xff1a; // 写法1&#xff1a;函数声明的写法async function foo1(…

Python | Leetcode Python题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:if not nums:return list()results list()nums.sort()visited [False] * len(nums)self.dfs(nums, results, list(), visited, 0)return resultsdef df…

Pytorch读取自己的数据集

数据集 流程图 导包设置tfs创建datasets.ImageFolder创建torch.utils.data.DataLoader() import time import os from tqdm import tqdm import pandas as pd import numpy as np import torch import torchvision import torch.nn as nn import torch.nn.functional as F im…

数据结构与算法学习笔记七---链栈的表示和实现(C++)

目录 1.链栈的概念 2.链栈的链式存储实现 1.初始化 2.销毁 3.清空栈 4.判断栈空 5.栈长 6.获取栈顶元素 7.入栈 8.出栈 9.遍历 10.完整代码 1.链栈的概念 链栈是指采用链式存储结构实现的栈。通常使用单链表来表示。链栈的示意图如下&…

ACL访问控制列表

ACL概述 为什么会有ACL 因为我们要过滤数据流量&#xff0c;要做访问控制&#xff0c;要保障内网安全 ACL是什么 ACL&#xff1a;访问控制列表是一个包含了多个规则的列表&#xff0c;不同规则通过规则号进行区分每个规则都包含动作条件两部分内容动作分为&#xff1a;允许…

【C#】学习获取程序执行路径,Gemini 帮助分析

一、前言&#xff1a; 在Delphi中&#xff0c;如果想要获取当前执行程序的目录&#xff0c;程序代码如下&#xff1a; ExtractFilePath(ParamStr(0)); 今天在分析一个别人做的C#程序时看到了一段C#代码&#xff0c;意思是获取执行程序所在的文件目录&#xff1a; public stat…