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

news/2024/10/29 7:25:18/

二叉树层序遍历

   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.ppmy.cn/news/1094884.html

相关文章

STM32-DMA

1 DMA简介 DMA&#xff08;Direct Memory Access&#xff09;,中文名为直接内存访问&#xff0c;它是一些计算机总线架构提供的功能&#xff0c;能使数据从附加设备&#xff08;如磁盘驱动器&#xff09;直接发送到计算机主板的内存上。对应嵌入式处理器来说&#xff0c;DMA可…

【0907 C高级day2】Shell脚本

一、作业&#xff1a;写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir在dir下创建dir1和dir2把当前目录下的所有文件拷贝到dir1中&#xff0c;把当前目录下的所有脚本文件拷贝到dir2中把dir2打包并压缩为dir2.tar.xz再把dir2.tar.xz移…

it设备综合监控系统

IT综合监控系统是一系列IT管理产品的总称&#xff0c;具有功能齐全、应用便捷、解决方案齐全的产品&#xff0c;可一站式服务满足消费者的各种IT管理需求。该产品涵盖网络管理、服务器管理、存储系统、安全管理等方面&#xff0c;可为企业提供对整个IT系统的全方位监控和管理。…

C++QT day2

作业 1> 封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&…

PMP证书续费是否真的有必要呢?(内附续证流程)

PMP项目管理专业人士资格认证是由项目管理协会&#xff08;Project Management Institute&#xff0c;简称PMI&#xff09;发起的。PMP作为世界级的项目管理认证证书&#xff0c;拥有着先进的项目管理知识体系&#xff0c;它严格评估项目管理人员知识技能是否具有高品质的资格认…

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…

【linux命令讲解大全】073.“Linux文件搜索工具:bzgrep和egrep的使用方法“

文章目录 bzgrep补充说明语法参数 egrep补充说明语法实例 从零学 python bzgrep 使用正则表达式搜索.bz2压缩包中的文件。 补充说明 bzgrep命令用于在.bz2压缩包中搜索符合正则表达式的内容&#xff0c;并将匹配的行输出到标准输出。 语法 bzgrep <pattern> <bz2…

【C++】类的封装 ① ( 类和对象 | 面向对象三大特征 - 封装 继承 多态 | 类的封装引入 )

文章目录 一、类和对象1、类和对象概念2、代码示例 - 定义类和对象 二、类的封装1、面向对象三大特征2、类的封装引入 一、类和对象 1、类和对象概念 " 面向对象编程 " 是一种 " 编程范式 " , 可以适用于所有的 高级语言 , C 也包括在内 ; 面向对象编程 基…