【牛客刷题】bfs和dfs (二叉树层序遍历、矩阵最长递增路径、被围绕的区域)

二叉树层序遍历

   vector<vector<int> > levelOrder(TreeNode* root) {// write code herevector<int> res;vector<vector<int>> result;if (root == nullptr) return result;queue<TreeNode*> que;que.push(root);while (!que.empty()) {int size = que.size();for (int i = 0; i < size; i++) {TreeNode* temp = que.front();que.pop();res.push_back(temp->val);if (temp->left) que.push(temp->left);if (temp->right) que.push(temp->right);}result.push_back(res);res.clear();}return result;}

矩阵最长递增路径

https://www.nowcoder.com/share/jump/9321389651694076681305
BFS 通常是为了找到最短路径,求最长路径最好用DFS!
在这里插入图片描述

拓扑排序(增加inDegrees矩阵)+ BFS

    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};vector<vector<int>> getInDegrees(vector<vector<int> >& grid) {int m = grid.size();int n = grid[0].size();vector<vector<int>> inDegrees(m, vector<int> (n, 0));for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < 4; k++) {int newX = i + dir[k][0];int newY = j + dir[k][1];if (newX < 0 || newX >= m || newY < 0 || newY >= n) continue;if (grid[i][j] > grid[newX][newY]) {inDegrees[i][j]++;}}}}return inDegrees;}int solve(vector<vector<int> >& matrix) {// write code herevector<vector<int>> inDegrees = getInDegrees(matrix);int maxLen = 0;queue<pair<int, int>> que;for (int i = 0; i < matrix.size(); i++) {for (int j = 0; j < matrix[0].size(); j++) {if (inDegrees[i][j] == 0) {que.push({i, j});}}}while (!que.empty()) {maxLen++;int size = que.size();for (int i = 0; i < size; i++) {//需要处理每层信息时这样写,类似于二叉树的层序遍历int x = que.front().first;int y = que.front().second;que.pop();for (int k = 0; k < 4; k++) {//遍历方向int newX = x + dir[k][0];int newY = y + dir[k][1];if (newX < 0 || newX >= matrix.size() || newY < 0 ||newY >= matrix[0].size()) continue;if (matrix[x][y] < matrix[newX][newY]) {//保证是递增序列inDegrees[newX][newY]--;//因为已经确保递增了,所以减少newX和newY的一个入度if (inDegrees[newX][newY] == 0) {//当入度全为0,表示条件全满足,所以可以入队que.push({newX, newY});}}}}}return maxLen;}
};

单纯的bfs:

    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};int bfs(vector<vector<int>>& matrix, vector<vector<bool>>& visited, int x,int y) {queue<pair<int, int>> que;que.push({x, y});visited[x][y] = true;int maxLen = 0;while (!que.empty()) {maxLen++;int size = que.size();for (int i = 0; i < size; i++) {//层处理int curX = que.front().first;int curY = que.front().second;que.pop();for (int k = 0; k < 4; k++) {//方向处理int newX = curX + dir[k][0];int newY = curY + dir[k][1];if (newX < 0 || newX >= matrix.size() || newY < 0 ||newY >= matrix[0].size()) continue;if (!visited[newX][newY] && matrix[curX][curY] < matrix[newX][newY]) {que.push({newX, newY});visited[newX][newY] = true;}}}}return maxLen;}int solve(vector<vector<int> >& matrix) {// write code herevector<vector<bool>> visited(matrix.size(), vector<bool>(matrix[0].size(),false));int maxLen = 0;for (int i = 0; i < matrix.size(); i++) {for (int j = 0; j < matrix[0].size(); j++) {maxLen = max(maxLen, bfs(matrix, visited, i, j));}}return maxLen;}};

dfs+记忆化搜索(memo):

    int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};int dfs(vector<vector<int>>& matrix, vector<vector<int>>& memo, int x, int y) {if (memo[x][y] != -1) return memo[x][y];//递归终止条件int maxLen = 1;for (int i = 0; i < 4; i++) {//遍历方向int newX = x + dir[i][0];int newY = y + dir[i][1];if (newX < 0 || newX >= matrix.size() || newY < 0 || newY >= matrix[0].size() ||matrix[newX][newY] <= matrix[x][y]) continue;//满足条件才递归maxLen = max(maxLen, 1 + dfs(matrix, memo, newX, newY));//表示从(x, y)到(newX, newY)这一步}memo[x][y] = maxLen;return memo[x][y];}int solve(vector<vector<int> >& matrix) {vector<vector<int>> memo(matrix.size(), vector<int>(matrix[0].size(), -1));int maxLen = 0;for (int i = 0; i < matrix.size(); i++) {for (int j = 0; j < matrix[0].size(); j++) {maxLen = max(maxLen, dfs(matrix, memo, i, j));}}return maxLen;}
};

被围绕的区域

https://www.nowcoder.com/share/jump/9321389651694087623428
在这里插入图片描述
dfs:

    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};void dfs(vector<vector<char>>& matrix, int x,int y) {int m = matrix.size(), n = matrix[0].size();matrix[x][y] = 'E';for (int i = 0; i < 4; i++) {int newX = x + dir[i][0];int newY = y + dir[i][1];if (newX < 0 || newX >= m || newY < 0 || newY >= n ||matrix[newX][newY] != 'O')continue;//(newX,newY)中超出边界的、不是O的不用管dfs(matrix, newX, newY);}}vector<vector<char> > surroundedArea(vector<vector<char> >& board) {// write code hereint m = board.size(), n = board[0].size();//将连接边界的O全部替换for (int i = 0; i < m; i++) {if (board[i][0] == 'O') dfs(board, i, 0);if (board[i][n - 1] == 'O') dfs(board, i, n - 1);}for (int j = 0; j < n; j++) {if (board[0][j] == 'O') dfs(board, 0, j);if (board[m - 1][j] == 'O') dfs(board, m - 1, j);}//又替换回来for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j] == 'E') board[i][j] = 'O';else board[i][j] = 'X';}}return board;}
};

bfs:

    int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};void bfs(vector<vector<char>>& matrix, int x, int y) {int m = matrix.size(), n = matrix[0].size();queue<pair<int, int>> que;que.push({x, y});while (!que.empty()) {int curX = que.front().first;int curY = que.front().second;que.pop();matrix[curX][curY] = 'E';for (int i = 0; i < 4; i++) {int newX = curX + dir[i][0];int newY = curY + dir[i][1];if (newX < 0 || newX >= m || newY < 0 || newY >= n ||matrix[newX][newY] != 'O')continue;//(newX,newY)中超出边界的、不是O的不用管que.push({newX, newY});}}}vector<vector<char> > surroundedArea(vector<vector<char> >& board) {// write code hereint m = board.size(), n = board[0].size();for (int i = 0; i < m; i++) {if (board[i][0] == 'O') bfs(board, i, 0);if (board[i][n - 1] == 'O') bfs(board, i, n - 1);}for (int j = 0; j < n; j++) {if (board[0][j] == 'O') bfs(board, 0, j);if (board[m - 1][j] == 'O') bfs(board, m - 1, j);}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j] == 'E') board[i][j] = 'O';else board[i][j] = 'X';}}return board;}
};

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

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

相关文章

算法专题:前缀和

文章目录 Acwing&#xff1a;前缀和示例2845.统计趣味子数组的数目思路容易理解的写法&#xff1a;前缀和两层循环存在问题&#xff1a;超时 优化写法&#xff1a;两数之和思路&#xff0c;转换为哈希表 前缀和&#xff0c;就是求数组中某一段的所有元素的和。 求子数组中某一…

【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C基础语法。六大默认构造函数简介、构造函数、析构函数、拷贝构造函数、赋值重载函数、const成员函数、取地址重载等。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&…

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群&#xff08;1&#xff09;初始化&#xff08;2&#xff09;部署网络插件flannel&#xff08;3&#xff09;创建 pod 资源 5.部署 …

网络编程套接字,Linux下实现echo服务器和客户端

目录 1、一些网络中的名词 1.1 IP地址 1.2 端口号port 1.3 "端口号" 和 "进程ID" 1.4 初始TCP协议 1.5 UDP协议 2、socket编程接口 2.1 socket 常见API 2.2 sockaddr结构 3、简单的网络程序 3.1 udp实现echo服务器和客户端 3.1.1 echo服务器实…

C++ 数组

C 数组 C 支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 number0、number1、...、number99&#xff0…

爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)

一、数据接口分析 主页地址&#xff1a;某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无 请求头是否加密&#xff1f; 通过查看“标头”可以发现&#xff0c;请求头中有一个key和value都是…

记一次生产环境服务卡死排查记录

接现场运维报告某java服务CPU狂飙&#xff0c;服务处于卡死无响应状态 询问现场运维什么场景造成的&#xff0c;答复是偶发现象&#xff0c;没有规律&#xff0c;和请求高峰期并没有关系。 因为服务是负载均衡的&#xff08;A、B两台&#xff09;&#xff0c;临时处理让运维重…

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述 【1】FlexFec 的保护方案 假设存在一组源数据包(D L)&#xff0c;其序列号从 1 开始运行到 D L 一维非交错行 FEC(1-D Non-interleaved Row FEC) : 一种连续的源数据包进行保护的方案&#xff0c;可用于恢复按行分组的源…

LaTeX总结-2023年9月8日

1. LaTeX总结 文章目录 1. LaTeX总结1.1. 定义作者&#xff0c;通讯作者&#xff0c;地址&#xff0c;宏包1.1.1. Example 11.1.2. Example 21.1.3. 特殊符号——作者标注注 1.2. 调整字体1.2.1. 数学模式下使用正体1.2.2. LaTeX内使用中文1.2.3. 正文文字 1.3. 常用符号及字母…

专业游戏翻译公司怎么选择比较合适

近年来&#xff0c;游戏行业持续繁荣&#xff0c;市场需求也在不断扩大&#xff0c;其中游戏翻译的需求越来越旺盛。无论是引进游戏还是让游戏走向国际市场&#xff0c;都需要专业的翻译公司来帮忙。那么&#xff0c;怎么选择合适的游戏翻译公司呢&#xff1f;让我们一起来看看…

大数据技术之Hadoop:HDFS存储原理篇(五)

目录 一、原理介绍 1.1 Block块 1.2 副本机制 二、fsck命令 2.1 设置默认副本数量 2.2 临时设置文件副本大小 2.3 fsck命令检查文件的副本数 2.4 block块大小的配置 三、NameNode元数据 3.1 NameNode作用 3.2 edits文件 3.3 FSImage文件 3.4 元素据合并控制参数 …

论文笔记:一分类及其在大数据中的潜在应用综述

0 概述 论文&#xff1a;A literature review on one‑class classification and its potential applications in big data 发表&#xff1a;Journal of Big Data 在严重不平衡的数据集中&#xff0c;使用传统的二分类或多分类通常会导致对具有大量实例的类的偏见。在这种情况…

小白备战大厂算法笔试(三)——栈、队列、双向队列

文章目录 栈栈常用操作栈的实现基于链表的实现基于数组的实现 两种实现对比栈典型应用 队列队列常用操作队列实现基于链表的实现基于数组的实现 队列典型应用 双向队列双向队列常用操作双向队列实现基于双向链表的实现基于数组的实现 双向队列应用 栈 栈是一种遵循先入后出的逻…

CVE-2017-12149

春秋云镜 CVE-2017-12149 JBoss反序列化漏洞 靶标介绍 2017年8月30日&#xff0c;厂商Redhat发布了一个JBOSSAS 5.x 的反序列化远程代码执行漏洞通告。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中&#xff0c;其doFilter方法在没有进行任何安全检查…

算法通关村第十三关——溢出问题处理模板

前言 溢出问题是面试当中输出涉及到数字的一个需要特别注意的地方&#xff0c;典型的题目有三个&#xff1a;数字反转&#xff0c;将字符串转成数字和回文数。 1.整数反转 力扣7题&#xff0c;给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。…

rk3399 linux 5.10 usb 2.0设备上电概率性注册失败

多次开关机&#xff0c;发现usb hub和4G都通信失败了&#xff0c;这就有点奇怪了&#xff0c;按理说usb驱动是没啥问题的 先查看usb log rootlinaro-alip:/# dmesg | grep usb [ 1.723797] usbcore: registered new interface driver usbfs [ 1.723828] usbcore: regis…

在很多公司里面会使用打tag的方式保留版本

&#xff1a;git tag|grep "xxx-dev“等分支来查看 2&#xff1a;git cherry-pick XXXXX 然后就是查看有冲突这些 git status 会出现相关的异常 然后解决相关的冲突 git add . git cherry-pick --continue git push XXX HEAD:refs/for/XXX 第一&#xff1a;git ta…

【LeetCode-中等题】17. 电话号码的字母组合

文章目录 题目方法一&#xff1a;递归回溯 题目 方法一&#xff1a;递归回溯 参考讲解&#xff1a;还得用回溯算法&#xff01;| LeetCode&#xff1a;17.电话号码的字母组合 首先可以画出树图&#xff1a; 先将数字对应的字符集合 加入到一个map集合 这里需要一个index来控…

伪静态web.config常见规则写法与参数介绍说明

伪静态web.config常见规则写法与参数介绍说明. 示例1&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"规则 1" stopProcessing"tru…

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…