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

优先级队列 

#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.mzph.cn/news/771191.shtml

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

相关文章

简单了解synchronized

什么是synchronized synchronized是Java提供的一个关键字&#xff0c;用于方法或者代码块&#xff0c;保证并发安全。 synchronized使用场景 同步代码块&#xff08;原子性&#xff09; synchronized可以用在方法上&#xff0c;或者用在代码块。 可锁的对象可以是普通对象…

JQ操作Dom(下)

一、设置样式 <div>设置样式</div> <script type"text/javascript">//设置一条样式$(div).css(background-color,red);//设置多条样式使用类名的方式 </script> <div>设置样式 </div> <script type"text/javascript&q…

C++语法|C++八股|内存泄漏杂谈

文章目录 定义分类防⽌内存泄露的方法 定义 内存泄漏是指已分配的内存未能成功释放&#xff0c;并且程序失去了对该内存的控制&#xff0c;因此无法再次使用或释放。随着程序的运行&#xff0c;内存泄漏会逐渐积累&#xff0c;最终可能导致内存不足&#xff0c;影响程序的性能…

Spring Boot设置io临时目录

在部署springboot项目&#xff0c;使用MultipartFile上传文件会出现以下异常 Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.3016596448718765136.18001/work/Tomcat/localhost/xx] is …

【ZZULI数据结构实验一】多项式的三则运算

【ZZULI数据结构实验一】多项式的四则运算 ♋ 结构设计♋ 方法声明♋ 方法实现&#x1f407; 定义一个多项式类型并初始化---CreateDataList&#x1f407; 增加节点---Getnewnode&#x1f407; 打印多项式类型的数据-- PrintPoly&#x1f407; 单链表的尾插--Listpush_back&…

C++ 优先级与结合性

运算优先级和结合性 表达式有多种运算符混合使用时&#xff0c;求解表达式的值&#xff0c;首先要解决各种运算符的运算优先次序问题。即&#xff0c;优先级和结合性。 例如&#xff1a;下面表达式的值取决于5种运算符的优先次序。 优先级是指不同级别运算符之间的运算次序&am…

VC++ class wizard介绍

Visual C的集成开发环境向用户提供了一个功能很强的操作类的工具—ClassWizard&#xff0c;我们可以利用该工具非常方便地向应用程序中添加类、向类中添加消息处理函数、成员函数、以及添加成员变量等。 一 、ClassWizard简介 ClassWizard既可以操作由AppWizard在应用程序框架…

海量数据处理项目-账号微服务和流量包数据库表+索引规范(上)

海量数据处理项目-账号微服务和流量包数据库表索引规范&#xff08;上&#xff09; 第1集 账号微服务和流量包数据库表索引规范讲解《上》 简介&#xff1a;账号微服务和流量包数据库表索引规范讲解 短链平台大课难度层级曲线图&#xff1a;由浅入深 索引规范 主键索引名为…

卡行领航家用户端是怎么拼团怎么挣钱的?

#领航家代理政策/怎么代理/奖金制度/双2.0模式# 全国V&#xff1a;ok1234vip 领航家用户端&#xff1a;0.52费率 一次拼团0.44费率 两次拼团0.36费率 三次拼团0.2费率 ………… 十次拼团&#xff0c;客户每月挣20480 领航家代理端&#xff1a;无押激活返现高达166/台 分润万5-万…

Shell教程_不同Shell中管道操作符的差异

Shell教程_不同Shell中管道操作符的差异 不同的 Unix / Linux Shell (如 Bash, Zsh, Csh 和 Fish 等) 在语法方面存在一些差异, 主要是因为它们采用了不同的设计理念和语法规则。 这些差异在编写 Shell 脚本或在命令行中使用不同的 Shell 时可能会引起困惑和问题。 因此, 有…

P1383 高级打字机(可持续化线段树)

题目描述 早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能&#xff0c;那就是它具备撤销功能&#xff0c;厉害吧。 请为这种高级打字机设计一个程序&#xff0c;支持如下 33 种操作&#xff1a; T x&#xff1a;Type 操作&#xff0c;表示在文章末尾打下一个小…

vue 中实现下载后端返回的流式数据

验证是否是blob /*** Event 验证是否为blob格式* */export async function blobValidate(data) {try {const text await data.text();JSON.parse(text);return false;} catch (error) {return true;}}get请求 /*** Event: get请求下载后端返回的数据流* description: url[Stri…

RockyLinux8 RockyLinux9安装postgresql16-devel开发包

1、PG的插件扩展有些需要自行编译&#xff0c;需要安装PG开发包 2、RockyLinux8安装 #创建用户先 useradd postgressudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disab…

计算机网络复试总结(五)

可能会问&#xff1a; 基础知识问题&#xff1a; 请简述TCP/IP协议栈的层次结构及其功能。 TCP/IP协议栈的层次结构及其功能可以简要概述如下&#xff1a; 层次结构&#xff1a; TCP/IP协议栈通常被划分为四个主要层次&#xff0c;从底层到高层分别是网络接口层&#xff08;也…

Flutter 旋转动画 线性变化的旋转动画

直接上代码 图片自己添加一张就好了 import dart:math;import package:flutter/material.dart;import package:flutter/animation.dart;void main() > runApp(MyApp()); //旋转动画 class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {re…

【python】正则表达式

文章目录 正则表达式对象re.RegexObjectre.MatchObject符号说明匹配基础匹配?=、?<=、?!、?<!字符类re模块编译正则表达式compile 函数匹配字符串re.matchre.searchre.findallre.finditer替换字符串re.sub分割字符串re.split正则表达式修饰符 - 可选标志主要用于网页…

ESCTF-逆向赛题WP

ESCTF_reverse题解 逆吧腻吧babypybabypolyreeasy_rere1你是个好孩子完结撒花 Q_W_Q 逆吧腻吧 下载副本后无壳&#xff0c;直接拖入ida分析分析函数逻辑&#xff1a;ida打开如下&#xff1a;提取出全局变量res的数据后&#xff0c;编写异或脚本进行解密&#xff1a; a[0xBF, …

Spring Task 知识点详解、案例、源代码解析

简介&#xff1a;Spring Task 定时任务   所谓定时任务。就是依据我们设定的时间定时运行任务&#xff0c;就像定时发邮件一样&#xff0c;设定时间到了。邮件就会自己主动发送。 在Spring大行其道的今天&#xff0c;Spring也提供了其定时任务功能&#xff0c;Spring Task。同…

【ARM64 常见汇编指令学习 22 -- ARMv8/v9 入栈寄存器介绍】

文章目录 ARMv8/v9 入栈寄存器介绍可以不入栈的寄存器需要入栈的寄存器&#xff08;被调用者保存的寄存器&#xff09;入栈顺序出栈顺序示例汇编代码 ARMv8/v9 入栈寄存器介绍 在 ARMv8 架构中&#xff0c;函数调用遵循一组称为 AAPCS64 &#xff08;ARMv8 64-bit Procedure C…

3.3 数据定义 数据库与系统概论

目录 3.3.1 模式的定义与删除 1. 定义模式 2. 删除模式 CASCADE&#xff08;级联&#xff09; RESTRICT&#xff08;限制&#xff09; 3.3.2 基本表的定义、删除与修改 表的定义 2.数据类型 3. 模式与表 4. 修改基本表 5. 删除基本表 3.3.3 索引的建立与删除 1. …