当前位置: 首页 > news >正文

队列(算法十三)

简介

几乎没有单纯之考察队列的,队列一般只作为一个辅助工具

队列常服务于BFS

queue接口

1.N叉树的层序遍历

link:

思路:

        队列 层序遍历即可

code

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:vector<vector<int>> levelOrder(Node* root) {if(!root) return {};vector<vector<int>> ans;queue<Node*> que;que.push(root);while(!que.empty()){int sz = que.size();vector<int> tmp;while(sz--){Node* pop = que.front();tmp.push_back(pop->val);que.pop();for(auto& e:pop->children){que.push(e);}}ans.push_back(tmp);}return ans;}
};

2.二叉树的锯齿形层序遍历

link:103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

思路

        在层序遍历基础上根据deep翻转即可

code

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {// 在层序遍历基础上来个标记为即可if(!root) return {};int deep = 0;// deep % 2 == 0 时需要逆序vector<vector<int>> ans;queue<TreeNode*> que;que.push(root);while(!que.empty()){deep++;vector<int> tmp = {};int sz = que.size();for(int i = 0; i < sz; i++){TreeNode* pop = que.front();que.pop();tmp.push_back(pop->val);if(pop->left)que.push(pop->left);if(pop->right)que.push(pop->right);}if(deep % 2 == 0)//逆序{reverse(tmp.begin(), tmp.end());}ans.push_back(tmp);}return ans;}
};

3.二叉树的最大宽度

link:662. 二叉树最大宽度 - 力扣(LeetCode)

思路:

        数组存储树 + 双端队列

        同余定理:

  •         即使最后参与运算的数据很大,会int溢出
  •         但是因为是减操作,只要结果不会溢出int,结果就是正确的

        unsigned 在溢出时不会报错

code1

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int widthOfBinaryTree(TreeNode* root) {// vector 模拟双端队列// 同余定理:保证即使int溢出, 结果也会正确if(!root) return 0;unsigned ans = 1;vector<pair<TreeNode*, unsigned>> dque = {{root, 1}};// unsigned 防止溢出报错while(!dque.empty()){ans = max(ans, dque.back().second - dque[0].second + 1);int sz = dque.size();for(int i = 0; i < sz; i++){pair<TreeNode*, unsigned> out = dque[0];dque.erase(dque.begin());if(out.first->left) dque.push_back({out.first->left, out.second * 2});if(out.first->right) dque.push_back({out.first->right, out.second * 2 + 1});}}return ans;}
};

code2

两个vector而不是一个队列,在层序遍历时会更方便,简洁,明了

同时使用结构化绑定

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int widthOfBinaryTree(TreeNode* root) {if(!root) return 0;unsigned ans = 1;vector<pair<TreeNode*, unsigned>> vt = {{root, 1}};while(vt.size()){decltype(vt) tmp = {};auto& [x1, y1] = vt[0];auto& [x2, y2] = vt.back();ans = max(ans, y2 - y1 + 1);for(auto& [node, val] : vt){if(node->left) tmp.push_back({node->left, val * 2});if(node->right) tmp.push_back({node->right, val * 2 + 1});}vt.swap(tmp);}return ans;}
};

4.在每个树行中寻找最大值

link:515. 在每个树行中找最大值 - 力扣(LeetCode)

思路:

        层序遍历即可

code

两个vector代替que,简洁明了,方便易懂;

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> largestValues(TreeNode* root) {if(!root) return {};vector<int> ans;vector<TreeNode*> vt = {root};while(!vt.empty()){int maxn = vt[0]->val;decltype(vt) tmp = {};for(auto& node : vt){maxn = max(maxn, node->val);if(node->left) tmp.push_back(node->left);if(node->right) tmp.push_back(node->right);}vt.swap(tmp);ans.push_back(maxn);}return ans;}
};

相关文章:

队列(算法十三)

简介 几乎没有单纯之考察队列的&#xff0c;队列一般只作为一个辅助工具 队列常服务于BFS queue接口 1.N叉树的层序遍历 link: 思路&#xff1a; 队列 层序遍历即可 code /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node()…...

vLLM私有化部署大语言模型LLM

目录 一、vLLM介绍 二、安装vLLM 1、安装环境 2、安装步骤 三、运行vLLM 1、运行方式 2、切换模型下载源 3、运行本地已下载模型 四、通过http访问vLLM 一、vLLM介绍 vLLM&#xff08;官方网址&#xff1a;https://www.vllm.ai&#xff09;是一种用于大规模语言模型&#x…...

OpenAI Whisper:语音识别技术的革新者—深入架构与参数

当下语音识别技术正以前所未有的速度发展&#xff0c;极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者&#xff0c;它凭借其卓越的性能、广泛的适用性和创新的技术架构&#xff0c;正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…...

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…...

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…...

Logback日志技术

Logback日志技术 日志 日志&#xff08;Logging&#xff09;是软件开发和运维中用于记录系统或应用程序运行期间发生的运行信息、状态变化、错误信息等的一种机制&#xff0c;这种记录的方式就好像我们日常生活中写日记一样。它提供了一种持久化的方式&#xff0c;使得开发者…...

9分布式微服务架构

分布式微服务架构不光需要从架构上的设计优化系统&#xff0c;还要在编码上优化达到最好的效果 中心化的设计 中心化的设计比较简单&#xff0c;分布式集群中的角色分为两种&#xff0c;管理者和被管理者。 在一个分布式或者集群中&#xff0c;管理者角色管理着其他处理实际…...

Leecode刷题C语言之统计重新排列后包含另一个字符串的子字符串数目②

执行结果:通过 执行用时和内存消耗如下&#xff1a; void update(int *diff, int c, int add, int *cnt) {diff[c] add;if (add 1 && diff[c] 0) {// 表明 diff[c] 由 -1 变为 0(*cnt)--;} else if (add -1 && diff[c] -1) {// 表明 diff[c] 由 0 变为 -…...

HTML和CSS相关的问题,为什么页面加载速度慢?

页面加载速度慢是网站优化中一个常见的问题&#xff0c;可能由于多种原因&#xff0c;包括HTML和CSS的代码编写方式、资源的加载顺序、页面渲染的复杂性等。以下是一些常见的原因和优化方法&#xff0c;结合实际项目代码示例进行讲解。 1. 过多的资源请求 如果页面包含大量的…...

LiveGBS流媒体平台GB/T28181常见问题-没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理?

LiveGBS没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理&#xff1f; 1、none rtp data receive2、搭建GB28181视频直播平台 1、none rtp data receive LiveSMS 收不到下级推流 首先需要排查服务器端 UDP & TCP 30000-30249 端口是否开放其次排…...

Flask表单处理与验证

Flask是一个轻量级的Python框架&#xff0c;它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库&#xff0c;用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑&#xff0c;使得表单处理更为简洁和优雅。下面&#xff0c;我们…...

正泰电工携手图扑:变电站数字孪生巡检平台

随着电力行业的快速发展与智能化转型&#xff0c;传统的人工巡检方式难以匹配现代电网对于效率、安全和精细化管理的高标准要求。在此背景下&#xff0c;构建智慧变电站巡检系统已成为推动变电站智能化进程、实现高效运营和保障电网可靠性的重要战略。 图扑软件与正泰电工联合…...

瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版

前言 在上一篇文章中&#xff0c;我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速&#xff0c;在这篇文章&#xff0c;我将讲解如何使用 ffmpeg-rockchip 用户空间库&#xff08;代码&#xff09;实现 MPP 硬件编解码。 本文不仅适…...

uniapp 预加载分包,减少loading

在 uniapp 中&#xff0c;可以通过配置 pages.json 文件中的 preloadRule 属性来实现页面预加载功能。以下是具体操作步骤&#xff1a; 1. 在 pages.json 中配置 preloadRule preloadRule 用于指定哪些页面需要预加载&#xff0c;以及预加载时机。下面是一个示例配置&#xf…...

c#删除文件和目录到回收站

之前在c上遇到过这个问题&#xff0c;折腾许久才解决了&#xff0c;这次在c#上再次遇到这个问题&#xff0c;不过似乎容易了一些&#xff0c;亲测代码如下&#xff0c;两种删除方式都写在代码中了。 直接上完整代码&#xff1a; using Microsoft.VisualBasic.FileIO; using Sy…...

GESP2024年12月认证C++六级( 第三部分编程题(1)树上游走)

参考程序&#xff1a; #include <iostream> #include <string>using namespace std;int main() {long long n, s; // n为移动次数&#xff0c;s为初始节点编号string moves; // 移动指令串// 输入处理cin >> n >> s;cin >> moves;long long…...

Redis数据结构服务器

Redis数据结构服务器 什么是Redis数据结构服务器 的概念和特点 是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存中的数据结构存储服务器&#xff0c;可用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09…...

【向量数据库 Milvus】centos8源码安装和部署 Milvus 2.5.3

在龙晰操作系统&#xff08;LoongArch 架构&#xff09;的 CentOS 8 环境中通过源码安装和部署 Milvus 2.5.3 可能会面临一些挑战&#xff0c;因为 Milvus 的官方支持主要集中在 x86 和 ARM 架构上。以下是一个详细的安装步骤&#xff0c;但需要注意&#xff0c;某些依赖项可能…...

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…...

C++实现设计模式---原型模式 (Prototype)

原型模式 (Prototype) 原型模式 是一种创建型设计模式&#xff0c;它通过复制现有对象来创建新对象&#xff0c;而不是通过实例化。 意图 使用原型实例指定要创建的对象类型&#xff0c;并通过复制该原型来生成新对象。提供一种高效创建对象的方式&#xff0c;尤其是当对象的…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...