数据结构 之 队列习题 力扣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.rhkb.cn/news/286523.html

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

相关文章

深度学习启蒙:神经网络基础与激活函数

目录 1.引言 2.神经网络架构与前向传播 2.1. 神经网络架构 2.2. 前向传播 3.常见激活函数公式与图像 3.1. sigmoid函数 3.2. tanh函数 3.3. ReLU函数 3.4. Leaky ReLU 3.5. Softmax函数 4.激活函数可视化比较与选择 4.1激活函数对比图像 4.1激活函数的选择策略…

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到typedef这个关键字&#xff0c;这个关键字的作用是给现有的类型取别名&#xff0c;在实际使用过程中往往是将一个复杂的类型名取一个简单的名字&#xff0c;便于我们的使用。就像我们给很熟的人取外号一样&#xff…

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三&#xff0e;游戏思路四&#xff0e;总结 一&#xff0e;前言 第一次用PyQt做游戏&#xff0c;有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏&#xff0c;支持基本游戏玩法、…

如何在Android设备上运行深度网络

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;将OpenCV与gdb驱动的IDE结合使用 下一篇&#xff1a;OpenCV4.9.0开源计算机视觉库安装教程 介绍 在本教程中&#xff0c;您将了解如何使用 OpenCV 深度学习模块在 Android …

【创建QT项目】使用向导创建

打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 弹出New Project对话框&#xff0c;选择Qt Widgets Application&#xff0c; 选择【Choose】按钮&#xff0c;弹出如下对话框 设置项目名称和路径&#xff0c;按照向导进行下一步&#x…

git-怎样把连续的多个commit合并成一个?

Git怎样把连续的多个commit合并成一个&#xff1f; Git怎样把连续的多个commit合并成一个&#xff1f; 参考URL: https://www.jianshu.com/p/5b4054b5b29e 查看git日志 git log --graph比如下图的commit 历史&#xff0c;想要把bai “Second change” 和 “Third change” 这…

基于FPGA的光纤通信系统设计

文章目录 光纤通信系统的组成发送端FPGA端口定义状态机设计代码示例 接收端功能模块端口定义状态机设计 光纤通信系统的组成 发送端FPGA 发送控制逻辑、数据编码、校验码生成、缓存控制、时钟控制 端口定义 状态机设计 代码示例 接收端功能模块 接收端控制逻辑、数据解码、…

Canine IP-10/CXCL 10 ELISA试剂盒上新

科研用Canine IP-10/CXCL 10 ELISA试剂盒重磅来袭&#xff0c;将在免疫学、癌症研究与神经科学等多个领域助力各位老师们的研究&#xff01; 图1&#xff1a;犬IP-10/CXCL10结构预测&#xff08;图片来源&#xff1a;UniProt&#xff09; C-X-C基序趋化因子(C-X-C motif chemok…

FPGA时钟资源详解(3)——全局时钟资源

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 一、概述 全局时钟是 FPGA 中的一种专用互连网络&#xff0c;旨在将时钟信号分配到 FPGA 内各种资源的时钟输入处。这种设计…

【EPLAN】授权-MAX100.17问题解决

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决EPLAN 客户端授权连接时出现-MAX100.17 报错问题&#xff1b; 2、 问题场景 用于解决在EPLAN 客户端授权连接时&#xff0c;出现-MAX100.17 报错&#xff1a;无法建立与EPLAN Client Service[MAX 100.17] 的连…

蓝桥杯java---螺旋矩阵

解题思路&#xff1a; int [][] arr new int[n][m];int i 0, j -1, temp 1;while (n * m > 0){for (int p 0; p < m; p)//从左自右arr[i][jj1] temp;n--;if (n * m 0) break;for (int p 0; p < n; p)//从上自下arr[ii1][j] temp;m--;if (n * m 0) break;fo…

【JavaEE】_Spring MVC项目获取URL中的参数

目录 1. 单参数 2. 多参数 1. 单参数 .java文件如下&#xff1a; package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*;import java.util.Arrays; import java.util.List;RequestMapping("/Para&…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图&#xff1a; 由点(node&#xff0c;或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树&#xff1a;特殊的图树&#xff0c;即连通无环图树的结点从根开始&#xff0c;层层扩展子树&#xff0c;是一种层次关系&#xff0c;这种层次关系&#xff0…

铁道障碍物检测6种YOLOV8

铁道障碍物检测6种&#xff0c;采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后转换成ONNX模型&#xff0c;OPENCV调用 铁道障碍物检测6种YOLOV8

【linux网络(一)】初识网络, 理解四层网络模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 初识网络…

nacos 启动 报堆内存问题

** nacos 启动 报堆内存问题 ** “nacos is starting with cluster” Error occurred during initialization of VM Could not reserve enough space for object heap 1、打开 …/nacos/bin/ startup.cmd 修改以下项&#xff08; nacos1.x 版本&#xff0c;如&#xff1a;na…

在 Linux/Ubuntu/Debian 上安装 SQL Server 2019

Microsoft 为 Linux 发行版&#xff08;包括 Ubuntu&#xff09;提供 SQL Server。 以下是有关如何执行此操作的基本指南&#xff1a; 注册 Microsoft Ubuntu 存储库并添加公共存储库 GPG 密钥&#xff1a; sudo wget -qO- https://packages.microsoft.com/keys/microsoft.as…

rancher2.6部署

rancher2.6部署 1、准备环境镜像 2、部署3、密码获取密码设置新密码 4、设置语言5、导入已有集群 1、准备 环境 docker-ce-20.10.23-3.el8.x86_64.rpm以及依赖rpm kubernetes&#xff1a;v1.23.17 镜像 &#xff08;rancher和k8s有个版本对应关系&#xff0c;rancher2.5就不…

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址&#xff1a;RedisInsight | The Best Redis GUI github开源地址&#xff1a;GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

RHCE:请给openlab搭建web

1.关闭所有安全软件已经防火墙 2.安装所需软件 3.在Windows 文件中进行DNS映射 C:\Windows\System32\drivers\etc\hosts 文件进 行DNS 映射 4.创建www.openlab.com网站 5.创建教学资料子网站 6.创建学生信息子网站 进行验证 7.创建缴费子网站