数据结构 之 队列习题 力扣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();
            }
            else
                g_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();//都为空才为空
    }
};

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

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

相关文章

Maven学习记录

一、简介 1. Maven&#xff1a; 基于 Java 平台的项目管理和整合工具&#xff0c;将项目的开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;。开发人员只需要做一些简单的配置&#xff0c;Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。…

把学浪视频保存到电脑方法

为了可以更好的学习很多用户都会想要将学浪的视频下载下来,但是学浪视频官方却没有提供下载方法,为了将学浪视频下载下来我研究了一段时间,总算有突破,找到了下载方法 文章中所用到的工具就在下面,有需要的自己取一下 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULr…

go的for循环应该这么用

目录 目录 一&#xff1a;介绍 1: for流程控制 2&#xff1a;for-range流程控制 二&#xff1a;实例展示 1&#xff1a;//按照一定次数循环 2&#xff1a;//无限循环 3: //循环遍历整数、各种容器和通道 4&#xff1a;遍历通道 5&#xff1a;//指针数组循环 6&…

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了&#xff0c;还没push&#xff0c;如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1&#xff08;等同于 git reset --mixed HEAD~1&#xff0…

机器学习OpenNLP

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl OpenNLP概述 OpenNLP是一个基于机器学习的自然语言处理开发工具包&#xff0c;它是Apache软件基金会的一个开源项目。OpenNLP支持多种自然语言处理任务&#xff0c;如分词、…

计算机网络:现代通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何忽略Chrome最小字号的限制

通过控制台调整字体大小时&#xff0c;可以发现即便设置了小于12px的字号&#xff0c;也并不会变小&#xff0c;这是因为Chrome默认最小字号为12px。 在Chrome设置中的外观选项卡中可以发现&#xff0c;默认字体是16px。将最小字号改为0&#xff0c;就能随意设置小于12px的字号…

面向对象【枚举类】

文章目录 枚举类定义枚举类enum 方式定义的要求和特点 enum 中常用方法实现接口的枚举类 枚举类 枚举类是一种特殊的类&#xff0c;它用于定义一组固定数量的常量。枚举类在实际开发中非常有用&#xff0c;因为它们可以增加代码的可读性和可维护性。本文将介绍Java枚举类的定义…

[网鼎杯2018]Unfinish 两种方法 -----不会编程的崽

网鼎杯太喜欢搞二次注入了吧。上次是无列名盲注&#xff0c;这次又是二次注入盲注。。。不知道方法还是挺难的。哎&#xff0c;网鼎嘛&#xff0c;能理解透彻就很强了。能自己做出来那可太nb了。 又是熟悉的登录框。不知道这是第几次看见网鼎杯的登录框了。后台扫描一下&#x…

基于深度学习的海洋鱼类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................ % 对测试集进行分类预测 [Pr…

西安石油大学校赛培训(1)数学模型简介 初等模型

数学建模竞赛 什么是数学建模竞赛?数学竞赛给人的印象是高深莫测的数学难题,和一个人、一支笔、一张纸&#xff0c;关在屋子里的冥思苦想&#xff0c;它训练严密的逻辑推理和准确的计算能力&#xff0c;而数学建模竞赛从内容到形式与此都有明显的不同。 数学建模竞赛的题目由日…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

学点儿Java_Day10_集合框架(List、Set、HashMap)

1 简介 ArrayList: 有序(放进去顺序和拿出来顺序一致)&#xff0c;可重复 HashSet: 无序(放进去顺序和拿出来顺序不一定一致)&#xff0c;不可重复 Testpublic void test1() {String[] array new String[3];//List: 有序 可重复//有序: 放入顺序 与 拿出顺序一致&#xff0c;…

Github多账号共存

在开发阶段&#xff0c;如果同时拥有多个开源代码托管平台的账户&#xff0c;在代码的管理上非常麻烦。那么&#xff0c;如果同一台机器上需要配置多个账户&#xff0c;怎样才能确保不冲突&#xff0c;不同账户独立下载独立提交呢&#xff1f; 我们以两个github账号进行演示 …

基于STM32的最小系统电路设计(手把手零基础教学)

文章目录 前言一、复位电路二、晶振电路三、电源转换电路四、SWD下载电路五、LED测试电路六、芯片外扩引脚七、STM32微控制电路总结 前言 在上篇介绍完《STM32的核心板制作流程》后&#xff0c;本篇我们将开始学习STM32最小系统电路的设计。具体包括复位电路、晶振电路、电源转…

快速入门go语言

环境搭建 编译器安装 1、编译器下载地址 2、打开命令行模式&#xff0c;输入go version ide安装 ide下载地址 依赖管理 goproxy 1、goproxy代理地址 // 阿里云 https://mirrors.aliyun.com/goproxy // 微软 https://goproxy.io // 七牛 https://goproxy.cn 2、ide配置g…

io的学习4

打印流 分类&#xff1a;打印流一般是指&#xff1a;PrintStream、PrintWriter两个类 特点&#xff1a; 1.打印流只操作文件目的地&#xff0c;不操作数据源 2.特有的写出方法可以实现&#xff0c;数据原样写出 3.特有的写出方法&#xff0c;可以实现自动刷新&#xff0c;…

openGauss + Datakit搭建openGauss运维平台

系统架构OS 硬件需求&#xff1a;2c4g [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# uname -m x86_64 [rootlocalhost ~]# hostname -I 192.168.92.32 下载地址&#xff1a;https://opengauss.org/zh/download/ 下载…

软考高级架构师:MVP 架构概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Vue3+Element Plus+TS开发企业管理后台(一)

系列文章&#xff0c;讲述一个企业管理后台的前后端设计&#xff0c;持续集成常见的页面功能和服务端设计思路。 效果展示 支持多种布局、主题配色随意切换 侧边菜单背景设置 主题色调切换 移动端完美适配 菜单侧边收起&#xff0c;适合移动端小空间场景。 功能开发计划 #merm…