【牛客刷题】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.hqwc.cn/news/102007.html

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

相关文章

gitLab(git)误提交命令

1.先使用下面命令查看一下分支上已提交的信息 git log 2.回退到之前的版本 git reset —hard 你要删除的提交哈希码&#xff08;一般是离这个命令最近的一串数字&#xff09; 3.覆盖掉远端的版本信息&#xff0c;使远端的仓库也回退到相应的版本 注意&#xff1a;切换到你提…

jmeter系列-测试计划详细介绍(3)

测试计划的作用 测试计划描述了 Jmeter 在执行时&#xff0c;一系列的步骤一个完整的测试计划包含了一个或多个【线程组、逻辑控制器、采样器、监听器、定时器、断言和配置元素】 Jmeter原件和组件的介绍 基本元件的介绍 多个类似功能组件的 容器&#xff08;类似于类&…

PCL 计算两异面直线公垂线垂足位置

目录 一、算法原理1、推导过程2、参考文献3、主要函数4、算法源码二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 1、推导过程 设置直线

PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...

全文下载链接:http://tecdat.cn/?p29480 作者&#xff1a;Xingsheng Yang 1 利用 python 爬取链家网公开的租房数据&#xff1b; 2 对租房信息进行分析&#xff0c;主要对房租相关特征进行分析&#xff0c;并搭建模型用于预测房租&#xff08;点击文末“阅读原文”获取完整代码…

UI基础——UGUI源码架构

文章目录 如何阅读源码UGUI源码整体架构源码整体类图事件模块EventSystem类图点击事件时序图 参考&#xff1a; 如何阅读源码 阅读源码是提高编程能力和技术水平的重要途径之一。以下是一些有效的阅读源码的方法&#xff1a; 确定目标&#xff1a;&#xff08;1&#xff09;了…

2023外贸SEO推广怎么做?

答案是&#xff1a;2023外贸SEO推广可以选择谷歌SEO谷歌Ads双向运营。 外贸SEO的核心要素 外贸SEO不仅仅是关于关键词排名&#xff0c;它更多的是关于品牌建设和目标受众的吸引。 要想成功&#xff0c;必须认识到几个关键要素。 了解目标市场 首先&#xff0c;要深入了解目…

ubuntu14.04改静态ip

现在可能已经用ubuntu14.04的人已经不多了&#xff0c;这里讲一下Ubuntu14.04怎么改静态ip 第一步&#xff1a;输入ifconfig查看ip和子网掩码 第二步&#xff1a;输入route -n查看网关 上面ip是192.168.88.136&#xff0c;子网掩码是255.255.255.0&#xff0c;网关是192.168.…

自动化运维——ansible (五十二) (01)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、概述 1.1 为什么要用自动化运维软件 1.2 自动化运维 1.3 自动化运维要注意的方面 1.4 自动化运维主要关注的方面 1.5 常见的开源自动化运维软件 1.6 自动化运维软件…

Zookeeper简述

数新网络-让每个人享受数据的价值 官网现已全新升级—欢迎访问&#xff01; 前 言 ZooKeeper是一个开源的、高可用的、分布式的协调服务&#xff0c;由Apache软件基金会维护。它旨在帮助管理和协调分布式系统和应用程序&#xff0c;提供了一个可靠的平台&#xff0c;用于处理…

WebServer 解析HTTP 请求报文

一、TCP 状态转换 浏览器访问网址&#xff0c;TCP传输全过程 二、TCP协议的通信过程 三、TCP 通信流程 // TCP 通信的流程 // 服务器端 &#xff08;被动接受连接的角色&#xff09; 1. 创建一个用于监听的套接字- 监听&#xff1a;监听有客户端的连接- 套接字&#xff1a;这…

【List篇】ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组&#xff0c;可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据&#xff0c;例如String&#xff0c;Integer&#xff0c;Boolean等。ArrayList实现了List接口&#xff0c;可以进行常见的List操作&#xff0c;例如添加、插…

云备份客户端——数据管理模块

数据管理模块设计之前&#xff0c;我们需要先明确该模块的信息是用来做什么的。根据上文分析该模块信息主要用于判断一个文件是否需要备份&#xff0c;判断条件有两个&#xff1a;1.新增文件 2.被修改过的文件 新增文件好判断&#xff0c;由于我们获得新文件后是先上传文件&…