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

news2024/11/17 13:45:52

二叉树层序遍历

   vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<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 here
        vector<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 here
        vector<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 here
        int 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 here
        int 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.coloradmin.cn/o/984866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)

文章目录 前置知识1005.K次取反后最大化的数组和题目描述分情况讨论贪心算法 134. 加油站题目描述暴力解法贪心算法 135. 分发糖果题目描述暴力解法贪心算法 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【23】&#xff1a;贪心算法专题-1&#xff08;分发饼…

Java8实战-总结19

Java8实战-总结19 使用流映射对流中每一个元素应用函数流的扁平化 使用流 映射 一个非常常见的数据处理套路就是从某些对象中选择信息。比如在SQL里&#xff0c;你可以从表中选择一列。Stream API也通过map和flatMap方法提供了类似的工具。 对流中每一个元素应用函数 流支持…

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现PCA-BP主成分降维算法结合BP神经网络多输入单输出回…

java八股文面试[设计模式]——行为型模式

目录 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式关注的是各个类之间的相互作用&#xff0c;将职责划分清楚&#xff0c;使得我们的代码更加地清晰。 策略模式 策略模式太常用了 下面设计的场景是&#xff0c;我们需要画一个图形&#xff0c;可选…

leetcode872. 叶子相似的树(java)

叶子相似的树 题目描述递归 题目描述 难度 - 简单 leetcode - 872. 叶子相似的树 请考虑一棵二叉树上所有的叶子&#xff0c;这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 举个例子&#xff0c;如上图所示&#xff0c;给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 如果…

cuda显存访问耗时

背景&#xff1a; 项目中有个数据量大小为5195 * 512 * 128float 1.268G的显存&#xff0c;发现有个函数调用很耗时&#xff0c;函数里面就是对这个显存进行128个元素求和&#xff0c;得到一个5195 * 512的图像 分析 1. 为什么耗时 直观上感觉这个流程应该不怎么耗时才对&a…

TDengine 官网换了新“皮肤”,来看看这个风格是不是你的菜

改版升级&#xff0c;不同以“网”&#xff01;为了更好地服务客户&#xff0c;让大家能够更便捷、清晰地了解我们的产品和功能&#xff0c;我们决定给 TDengine 官网换个新“皮肤”~精心筹备下&#xff0c;新官网终于成功与大家见面啦——https://www.taosdata.com/。TDengine…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3稳定性

在当今的互联网时代,稳定性是所有系统和应用程序的关键要素。无论是大型数据中心还是个人电脑,稳定性都是保证正常运行和用户体验的基础。在这个背景下,我们来谈谈 Milvus,一个开源的向量数据库,它在 2.1.0 版本中引入了内存多副本的概念。 Milvus 是一个开源的向量数据库…

9:00面试,9:08就出来了,问的实在有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降30%,…

osgEarth::ElevationQuery的setMaxTilesToCache函数的作用

【引子】 osgEarth::ElevationQuery类用于查询高程&#xff0c;自测效率比较低&#xff08;大概每个点需要四五十毫秒&#xff09;&#xff0c;成员函数setMaxTilesToCache(int)&#xff0c;之前看说明仍然不是很确认其具体的意义&#xff0c;想尝试设置是否能加速下。 看之前的…

MATLAB实现TopSis优劣解距离法——分析《世界征服者3》将领排名

问题背景 世界征服者3游戏中有150的将领角色&#xff0c;每个将领都有自己的兵种优势、军阶、技能等不同的属性&#xff0c;如何教务客观、综合全面地选拔出其中排名前50的将领&#xff1f;基于TOPSIS优劣解距离法以及聚类算法&#xff0c;给出大家较为客观的排名。 一.问题描…

使用树莓派搭建个人网站,并发布到外网可访问:实用步骤解析

文章目录 前言使用 Raspberry Pi Imager 安装 Raspberry Pi OS测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配置cpolar服务开机自启动 前言 …

Day_81-87 CNN卷积神经网络

目录 一. CNN卷积神经网络与传统神经网络的不同 1. 模型图 2. 参数分布情况 3. 卷积神经网络和传统神经网络的层次结构 4. 传统神经网络的缺点&#xff1a; 二. CNN的基本操作 1. 卷积 2. 池化 三. CNN实现过程 1. 算法流程图 2. 输入层 3. 卷积层 4. 激活层 5. 池化层 6. 全连…

LINE自动回复:快速回复提升客服效率

2023年&#xff0c;LINE在其4个主要市场&#xff1a;对话、日本、台湾和泰国拥有约1.78亿月活跃用户。 LINE不仅是一个通讯软件&#xff0c;更提供广泛的服务&#xff0c;包括语音和视讯通话、群组、发布社交帖子及商务功能。近年来&#xff0c;越来越多的企业在客户服务中使用…

搭建花店小程序商城的详细步骤

首先&#xff0c;你需要找一个专业成熟的小程序商城制作平台。一个优秀的小程序商城制作平台应该具备丰富的行业模板、简便的设计工具和强大的功能模块。在这里&#xff0c;我们推荐乔拓云平台&#xff0c;其后台管理页面友好&#xff0c;设计搭建页面功能齐全&#xff0c;且针…

画流程图大家都用哪些工具?

流程图工具是一个用于创建图表和图形功能的应用程序。这些流程图工具允许团队成员在绘图软件上合作&#xff0c;制作的流程图可以提供清晰的视觉效果、即时沟通、有效的协调和有效的分析&#xff0c;从而提高设计的工作效率。下面将推荐6个流程图工具&#xff0c;我相信总有一个…

C高级第2天

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

Vue的props配置项

简介&#xff1a;Vue中的组件模板是可以复用的&#xff0c;但是模板中的数据是可以改变的。props配置项用于解决组件迁移复用时接受和保存传递给组件的数据的问题。 1.如何给组件传递数据&#xff1f; 答&#xff1a;按照key:value的形式进行传递。 2.如何保存传递给组件的数…

Vulnhub: Masashi: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容&#xff0c;tftp服务在1337端口 sshfolder.txt内容&#xff0c…

鞋店小程序商城开发指南

网站制作教程分享&#xff01;新手也能学会的鞋店自建网站教程 在开发鞋店小程序商城时&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 浏览器搜索【乔拓云】注册登录账号进入操作后台&#xff0c;找到并点击【商城】中的【去管理】进入商城的后台管理页面。接着&…