数据结构 之 队列习题 力扣oj(附加思路版)

news/2024/4/28 17:02:07/文章来源:https://blog.csdn.net/m0_68987050/article/details/136888192

优先级队列 

#include<queue> --队列 和 优先级队列的头文件

优先级队列: 堆结构 最大堆 和 最小堆

相关函数:
    front() 获取第一个元素
    back() 获取最后一个元素
    push() 放入元素
    pop() 弹出第一个元素
    size() 计算队列中元素的个数
    empty() 判断是否为空 为空返回true 不为空返回false

石头的重量

1046. 最后一块石头的重量icon-default.png?t=N7T8https://leetcode.cn/problems/last-stone-weight/


有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

  • 如果 x == y,那么两块石头都会被完全粉碎;
  • 如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x

最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0

思路

        利用优先级,队列默认最大堆结构将数组中元素升序排一下,然后每次取出堆顶元素和堆顶下一位,用两个变量接收(利用top和pop函数)。

class Solution {
public:int lastStoneWeight(vector<int>& stones) {priority_queue<int> q;for(int i=0; i<stones.size(); i++){q.push(stones[i]);}while(q.size()>1){int x=q.top();q.pop();int y=q.top();q.pop();if(x != y) {q.push(x-y);}}if(q.empty()) {return 0;} else {return q.top();}}
};

分发饼干 

455. 分发饼干icon-default.png?t=N7T8https://leetcode.cn/problems/assign-cookies/

        假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。4

与上题思路相同 

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {priority_queue<int> g_que,s_que;int res=0;for(int i=0;i<g.size();i++){g_que.push(g[i]);}for(int i=0;i<s.size();i++){s_que.push(s[i]);}while(!s_que.empty()&&!g_que.empty())//当同时存在时{if(g_que.top()<= s_que.top()){res++;g_que.pop();s_que.pop();}elseg_que.pop();}return res;}
};

 

面试题:最小k个数 

面试题 17.14. 最小K个数icon-default.png?t=N7T8https://leetcode.cn/problems/smallest-k-lcci/

提示

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

思路

        创建一个队列(队列默认最大堆结构),将前k个始终维护成最大堆结构,k~arr.size()-1中每个元素始终与栈顶元素作比较,最终队列即为所求。

        如果用最小堆的话,当数据量非常大时,时间复杂度太高了。

class Solution {
public:vector<int> smallestK(vector<int>& arr, int k) {if(k==0||arr.size()==0)return {};priority_queue<int> que;vector<int>res;for(int i=0;i<k;i++)que.push(arr[i]);for(int i=k;i<arr.size();i++){if(arr[i]<que.top()){que.pop();que.push(arr[i]);}}while(!que.empty()){res.push_back(que.top());que.pop();}return res;}
};

 

队列

周末舞会 

1332:【例2-1】周末舞会

【题目描述】

        假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。

【输入】

        第一行两队的人数;

        第二行舞曲的数目。

【输出】

        配对情况。

思路:        

        这段代码通过两个队列分别表示舞会上的男士和女士队伍,循环读取舞曲数目来模拟配对跳舞的过程。对于每首舞曲,从男女队列的队首分别取出一个人配对为舞伴,然后将这对舞伴放回队列的末尾以便参与下一轮配对,直至所有舞曲播放完毕。这样,通过队列的先进先出特性,实现了一个简单的舞伴轮换配对模拟。

#include<iostream>
#include<queue>//栈的头文件
using namespace std;int main()
{int m, n, k;cin >> m >> n >> k;queue<int>s1;queue<int>s2;for (int j = 1; j <= m; j++){s1.push(j);}for (int c = 1; c <= n; c++){s2.push(c);}for (int i = 1; i <= k; i++){cout << s1.front() << s2.front() << endl;int x = s1.front(), y = s2.front();s1.pop(); s2.pop();s1.push(x), s2.push(y);}return 0;
}

面试题--用两个队列实现栈 

225. 用队列实现栈icon-default.png?t=N7T8https://leetcode.cn/problems/implement-stack-using-queues/

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

思路

        这段代码通过两个队列`q1`和`q2`来模拟一个后入先出(LIFO)的栈结构。当新元素被加入(`push`操作)时,它直接进入`q1`。为了模拟栈的`pop`操作,代码将`q1`中的元素,除了最后一个加入的元素之外,都转移到`q2`中,这样`q1`中剩下的最后一个元素就是需要被`pop`的元素。在这个元素被移除后,`q2`的内容回到`q1`,实现了后入先出的逻辑。`top`操作简单地返回`q1`的最后一个元素,而`empty`操作检查`q1`是否为空,从而判断栈是否为空。

class MyStack {
public:queue<int>q1;queue<int>q2;void push(int x) {q1.push(x);}int pop() {while(q1.size()>1)//队列中只剩下一个元素{q2.push(q1.front());q1.pop();}int x=q1.front();//记录最后一个元素 即返回值q1.pop();q1=q2;while(!q2.empty())//清空q2{q2.pop();}return x;}int top() {return q1.back();}bool empty() {return q1.empty();}
};

 

面试题--用两个栈实现队列

232. 用栈实现队列icon-default.png?t=N7T8https://leetcode.cn/problems/implement-queue-using-stacks/

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

 思路

        这段代码使用两个栈`s1`和`s2`来实现一个队列。当元素被推入队列时,它被压入`s1`。要执行`pop`或`peek`操作时,如果`s2`为空,`s1`的所有元素逆序转移到`s2`中,使得`s1`的底部元素移动到`s2`的顶部,即队列的前端。这样,从`s2`中弹出或查看顶部元素就可以模拟队列的`pop`和`peek`操作。`empty`操作通过检查两个栈是否都为空来判断队列是否为空,实现了一个先入先出的队列行为。

class MyQueue {
public:
/*先将栈中元素除了最后一个取出*/
stack<int>s1;
stack<int>s2;void push(int x) {s1.push(x);}int pop() {if(s2.empty())//s2不为空的话直接删除,为空将s1中元素全部放入s2{while(!s1.empty()){s2.push(s1.top());s1.pop();}}int x=s2.top();s2.pop();return x;}int peek() {if(s2.empty())//s2不为空的话直接删除,为空将s1中元素全部放入s2{while(!s1.empty()){s2.push(s1.top());s1.pop();}}int x=s2.top();return x;}bool empty() {return s1.empty()&&s2.empty();//都为空才为空}
};

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

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

相关文章

鸿蒙HarmonyOS应用开发之USB DDK开发指导

场景介绍 USB DDK&#xff08;USB Driver Develop Kit&#xff09;是为开发者提供的USB驱动程序开发套件&#xff0c;支持开发者基于用户态&#xff0c;在应用层开发USB设备驱动。提供了一系列主机侧访问设备的接口&#xff0c;包括主机侧打开和关闭接口、管道同步异步读写通信…

学习JavaEE的日子 Day32 线程池

Day32 线程池 1.引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间&#xff0c;从而提高程序的性能。项目中可以把Time…

没学数模电可以玩单片机吗?

我们首先来看一下数电模电在单片机中的应用。数电知识在单片机中主要解决各种数字信号的处理、运算&#xff0c;如数制转换、数据运算等。模电知识在单片机中主要解决各种模拟信号的处理问题&#xff0c;如采集光照强度、声音的分贝、温度等模拟信号。而数电、模电的相互转换就…

Ubuntu 系统下安装 Redis

目录 一、上传 Redis 安装包并解压缩 二、编译 1、安装gcc&#xff0c;不然后面编译报错 2、开始编译 三、生成后台服务 四、修改配置文件 1、设置密码 2、设置后台启动 五、启动服务 一、上传 Redis 安装包并解压缩 tar -zxvf redis-6.0.2.tar.gz 二、编译 1、安装g…

【分布式】——CAPBASE理论

CAP&BASE理论 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/tree-learning-notes ⭐⭐⭐⭐⭐⭐ Spring专栏&#x1f449;https://blog.csdn.net/weixin_53580595/category_12279588.html Sprin…

C语言用if语句设计选择结构程序

在C语言中&#xff0c;if语句是一种常用的选择结构语句&#xff0c;用于根据条件选择性地执行不同的代码块。if语句的设计使得程序可以根据条件的真假进行分支控制&#xff0c;从而实现灵活的程序逻辑。本文将深入介绍C语言中如何使用if语句设计选择结构程序&#xff0c;包括if…

Elasticsearch 和 Kibana 8.13:简化 kNN 和改进查询并行化

作者&#xff1a;Gilad Gal, Tyler Perkins, Srikanth Manvi, Aris Papadopoulos, Trevor Blackford 在 8.13 版本中&#xff0c;Elastic 引入了向量搜索的重大增强&#xff0c;并将 Cohere 嵌入集成到其统一 inference API 中。这些更新简化了将大型语言模型&#xff08;LLM&a…

企业微信变更主体公证怎么弄?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…

【python 数据可视化】 WordCloud词云图

目录 词云简介 准备工作 安装方法一&#xff1a; 安装方法二&#xff1a; 生成词云步骤 数据预处理&#xff1a; 分词&#xff1a; 统计词频出现的次数&#xff1a; 去除词语&#xff1a; 生成词云&#xff1a; 显示词云&#xff1a; 保存词云&#xff1a; 完整代码 词…

ClickHouse06-ClickHouse中基础的增删改查

使用数据库&#xff0c;最基础的学习都是增、删、改、查&#xff0c;然后才会去了解基础函数和高阶函数&#xff0c;今天就来看看大火的 ClickHouse 中简单的增删改查怎么写&#xff1f; 创建数据库&#xff1a;create database创建表格&#xff1a;create table修改表格&…

jmeter总结之:Regular Expression Extractor元件

Regular Expression Extractor是一个后处理器元件&#xff0c;使用正则从服务器的响应中提取数据&#xff0c;并将这些数据保存到JMeter变量中&#xff0c;以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…

AugmentedReality之路-通过蓝图启动AR相机(2)

本文实现打开AR相机和关闭AR相机功能&#xff0c;在主界面点击Start AR按钮后打开AR相机&#xff0c;在主界面点击Stop AR按钮后关闭AR相机 1、启动AR相关插件 通过Edit->Plugins启用AugmentedReality下面的所有插件 2、自定义Pawn 在Content->ARBase目录右键&…

【tensorflow框架神经网络实现鸢尾花分类】

文章目录 1、数据获取2、数据集构建3、模型的训练验证可视化训练过程 1、数据获取 从sklearn中获取鸢尾花数据&#xff0c;并合并处理 from sklearn.datasets import load_iris import pandas as pdx_data load_iris().data y_data load_iris().targetx_data pd.DataFrame…

Scikit-Learn K近邻分类

Scikit-Learn K近邻分类 1、K近邻分类1.1、K近邻分类及原理1.2、超参数K1.3、K近邻分类的优缺点2、Scikit-Learn K近邻分类2.1、Scikit-Learn K近邻分类API2.2、K近邻分类实践(鸢尾花分类)2.3、交叉验证寻找最佳K2.4、K近邻分类与Pipeline1、K近邻分类 K近邻是一种常用的分类…

ES学习日记(一)-------单节点安装启动

基于ES7.4.1编写,其实一开始用的最新的8.1,但是问题太多了!!!!不稳定,降到7.4 下载好的安装包上传到服务器或虚拟机,创建ES目录,命令mkdir -p /路径xxxx 复制安装包到指定路径并解压: tar zxvf elasticsearch-8.1.0-linux-x86_64.tar.gz -C /usr/local/es/ 进入bin目录安装,命…

bugku-web-Flask_FileUpload

查看页面源码 这里提示给他一个文件&#xff0c;它将返回一个python运行结果给我&#xff0c;并且提示只能上传jpg和png文件 传递一个图片 查看源码 传递一个非图片 将源码写入新建的txt文件中 print(hello world) 将文件后缀改为jpg 上传 上传成功 查看源码 得到运行结果 我…

SpringMVC第一个helloword项目

文章目录 前言一、SpringMVC是什么&#xff1f;二、使用步骤1.引入库2.创建控制层3.创建springmvc.xml4.配置web.xml文件5.编写视图页面 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; SpringMVC 提示&#xff1a;以下是本篇文章正文内容&#xf…

​python学习之变量类型​

print单纯输中的十种数据类型只需要用print()函数即可&#xff0c;()里面直接写变量名。 下面重点介绍print格式输出&#xff1a; 第一种方法&#xff1a;一个萝卜一个坑&#xff0c;下面的代码中&#xff0c;{0}、{1}、{2}分别表示j,i,j*i&#xff0c;单引号里面是输出格式。…

WPF 多路绑定、值转换器ValueConvert、数据校验

值转换器 valueconvert 使用ValueConverter需要实现IValueConverter接口&#xff0c;其内部有两个方法&#xff0c;Convert和ConvertBack。我们在使用Binding绑定数据的时候&#xff0c;当遇到源属性和目标控件需要的类型不一致的&#xff0c;就可以使用ValueConverter&#xf…

将html文件转化为pdf

1.用浏览器将html文件打开 2.空白处右键点击打印 3.另存为PDF即可