【牛客刷题】笔记2

目录

1、单词搜索

2、岛屿数量

2.1 DFS

2.2 BFS

3、腐烂的橘子


1、单词搜索

单词搜索_牛客题霸_牛客网 (nowcoder.com)

这道题我们就是先遍历数组board,若遇到了与word[0]相等的字符,则以这个字符为起点进行搜索,搜索可以是dfs,也可以是bfs,在这里我们使用的是dfs。

class Solution {public:int m, n;bool vis[101][101] = {0}; // vis用来标记某一位置是否已经被搜索过了,0表示没有,1表示有int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool dfs(vector<string>& board, int i, int j, string& word, int pos){if(pos == word.size() - 1) return true;vis[i][j] = true;for(int k = 0;k < 4;k++){int a = i + dx[k], b = j + dy[k];if(a >= 0 && a < m && b >= 0 && b < n && !vis[a][b] && board[a][b] == word[pos + 1]){if(dfs(board, a, b, word, pos + 1)) return true;}}vis[i][j] = false; // 恢复现场return false;}bool exist(vector<string>& board, string word) {m = board.size(), n = board[0].size();for(int i = 0;i < m;i++)for(int j = 0;j < n;j++)if(board[i][j] == word[0])if(dfs(board, i, j, word, 0)) return true;return false;}};

2、岛屿数量

200. 岛屿数量 - 力扣(LeetCode)

2.1 DFS

我们需要先遍历二维数组,当遇到字符1时,就将ans++,并将1所在的整个岛屿都变成0,都变成0后就继续刚刚的遍历二维数组,重复上面的操作,直到将二维数组遍历完,ans就是岛屿数量。

遇到1时,将整个岛屿变成0的操作,就可以使用DFS。从遇到1的地点开始,进行DFS,直到将整个岛屿都变成了0结束

class Solution {
private://  DFSint n, m;int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};void dfs(vector<vector<char>>& grid, int x, int y){// 若位置不合法或者是'0',就返回if(x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == '0') return ;grid[x][y] = '0'; // 将当前位置变成'0'for(int i = 0;i < 4;i ++) // 搜索当前位置的上下左右4个位置dfs(grid, x + dx[i], y + dy[i]);}
public:int numIslands(vector<vector<char>>& grid) {n = grid.size(), m = grid[0].size();int sum = 0;for(int i = 0;i < n;i ++)for(int j = 0;j < m;j ++)if(grid[i][j] == '1'){sum ++;dfs(grid, i, j);}return sum;}
};

2.2 BFS

与DFS前面步骤是类似的。我们需要先遍历二维数组,当遇到字符1时,就将ans++,并将1所在的整个岛屿都变成0,都变成0后就继续刚刚的遍历二维数组,重复上面的操作,直到将二维数组遍历完,ans就是岛屿数量。

遇到1时,将整个岛屿变成0的操作,就可以使用BFS。从遇到1的地点开始,进行DFS,直到将整个岛屿都变成了0结束

class Solution {
private:// BFSint n, m;const int dx[4] = {-1, 1, 0, 0};const int dy[4] = {0, 0, -1, 1};void bfs(vector<vector<char>>& grid, int x, int y){queue<pair<int, int>> q;q.push({x, y});while(!q.empty()){int currentRow = q.front().first, currentCol = q.front().second;q.pop();grid[currentRow][currentCol] = '0';  // 标记为已访问for(int k = 0; k < 4; k++){int i = currentRow + dx[k], j = currentCol + dy[k];if(i >= 0 && i < n && j >= 0 && j < m && grid[i][j] == '1') q.push({i, j});}}}public:int numIslands(vector<vector<char>>& grid) {if (grid.empty() || grid[0].empty()) return 0;  // 检查边界条件n = grid.size(), m = grid[0].size();int sum = 0;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(grid[i][j] == '1'){sum++;bfs(grid, i, j);}return sum;}
};

此时就会发现逻辑全对,但是却超时了。这是因为我们在从队列中取出一个点时才标记已访问,这样会导致重复加入,应该在放入队列时就标记已访问。


若取出时才标记已访问,会发现下标为[1][1]的点会被下标为[0][1]、[1][0]的点都放入一次队列。

class Solution {
private:// BFSint n, m;const int dx[4] = {-1, 1, 0, 0};const int dy[4] = {0, 0, -1, 1};void bfs(vector<vector<char>>& grid, int x, int y){queue<pair<int, int>> q;q.push({x, y});grid[x][y] = '0'; // 放入时就标记while(!q.empty()){int currentRow = q.front().first, currentCol = q.front().second;q.pop();for(int k = 0; k < 4; k++){int i = currentRow + dx[k], j = currentCol + dy[k];if(i >= 0 && i < n && j >= 0 && j < m && grid[i][j] == '1'){q.push({i, j});grid[i][j] = '0';}}}}public:int numIslands(vector<vector<char>>& grid) {if (grid.empty() || grid[0].empty()) return 0;  // 检查边界条件n = grid.size(), m = grid[0].size();int sum = 0;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(grid[i][j] == '1'){sum++;bfs(grid, i, j);}return sum;}
};

3、腐烂的橘子

994. 腐烂的橘子 - 力扣(LeetCode)

这道题看似与岛屿数量是有点类似的。我们可以先遍历二维数组,当遇到值为2的结点时,就以此结点为起点,进行搜索。注意:这道题的搜索就好使用BFS,因为橘子腐烂的传递是向四个方向进行传递的。这样子的思路是会有问题的,因为一个区域内可能不止有一个腐烂的橘子,这些橘子是会一起向四周扩散的。所以,使用多源BFS。

正确的做法是:我们先遍历原数组,值为2的结点都放入队列,我们一次处理队列中的所有元素

class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size(), sum = 0;int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};queue<pair<int, int>> q;for(int i = 0;i < n;i ++)for(int j = 0;j < m;j ++)if(grid[i][j] == 2) q.push({i, j});while(!q.empty()){vector<pair<int, int>> v;while(!q.empty()){v.push_back({q.front().first, q.front().second});q.pop();}// 标记最后一步是否有执行,因为当全扩散完后,还会再循环一次,导致sum多加一次,所以有一个标记,当没有向队列中放入时,sum就不会++bool flag = false; for(int k = 0;k < v.size();k++){for(int i = 0; i < 4; i++){int a = v[k].first + dx[i], b = v[k].second + dy[i];if(a >= 0 && a < n && b >= 0 && b < m && grid[a][b] == 1){q.push({a, b});grid[a][b] = 2;flag = true;}}}if(flag) sum ++;}for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(grid[i][j] == 1) return -1; // 若还有1,表示有些位置一定不会腐烂return sum;}
};

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

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

相关文章

#每日一题#自动化 2024年10月

#每日一题#自动化 2024年10月 1、深拷贝和浅拷贝的区别是什么&#xff1f; 参考答案&#xff1a; 深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中&#xff0c;我们使用 deepcopy&#xff08;&#xff09;函数进行深拷贝…

MyBatis-Plus(二):resultType 的选择——int 与 java.lang.Integer 的区别

resultType 的选择——int 与 java.lang.Integer 的区别 1、概述2、resultType介绍2.1、使用int2.2、使用java.lang.Integer 3、如何选择4、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。…

蘑菇分类识别数据集(猫脸码客 第222期)

蘑菇分类识别文本/图像数据集 蘑菇&#xff0c;作为一种广泛分布于全球的真菌&#xff0c;隶属于伞菌目伞菌亚门蘑菇科蘑菇属&#xff0c;拥有众多别名&#xff0c;如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一&#xff0c;还在许…

Java程序设计:spring boot(8)——API ⽂档构建⼯具 - Swagger2

目录 1 环境整合配置 2 Swagger2 常⽤注解说明 2.1 Api 2.2 ApiOperation 2.3 ApiImplicitParams 2.4 ApiResponses 2.5 ApiModel 3 用户模块注解配置 3.1 Controller 使用注解 3.2 JavaBean 使用注解 4 Swagger2 接⼝⽂档访问 由于 Spring Boot 能够快速开发、便捷…

理解JVM

文章目录 前言一、JVM 内存区域划分二、JVM 中类加载的过程a.类加载的基本流程&#xff08;熟练背诵&#xff09;b.双亲委派模型 三、JVM 中的垃圾回收机制&#xff08;GC&#xff09;1.找到垃圾2.如何回收垃圾&#xff1f; 总结 前言 JVM 内部涉及到的内容是非常广泛的。咱们…

【Qt】Qt的介绍——Qt的概念、使用Qt Creator新建项目、运行Qt项目、纯代码方式、可视化操作、认识对象模型(对象树)

文章目录 Qt1. Qt的概念2. 使用Qt Creator新建项目3. 运行Qt项目3.1 纯代码方式实现3.2 可视化操作实现 4. 认识对象模型&#xff08;对象树&#xff09; Qt 1. Qt的概念 Qt 是一个跨平台的 C 图形用户界面应用程序开发框架。它是软件开发者提供的用于界面开发的程序框架&#…

PCC Net模型实现行人数量统计

关注底部公众号&#xff0c;回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 项目简介 PCC Net是一种用于拥挤场景下行人计数的深度学习模型。该项目的目标是利用神经网络&#xff0c;准确地统计给定区域内的行人数…

Visual Studio Code

代码自动保存 打开设置搜索auto save&#xff0c;设置为afterDelay 设置延迟时间&#xff0c;单位是毫秒 启用Ctrl鼠标滚轮对字体进行缩放 搜索Mouse Wheel Zoom&#xff0c;把该选项勾选上即可

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处&#xff0c;在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis&#xff1a;查找命令的程序文件位置 2、locate&#xff1a;也是一种文件查找&#xff0c;但是基于数据库的查找 3、find&#xff1a;针…

Artistic Oil Paint 艺术油画着色器插件

只需轻轻一点&#xff0c;即可将您的视频游戏转化为艺术品&#xff01;&#xff08;也许更多…&#xff09;。 ✓ 整个商店中最可配置的选项。 ✓ 六种先进算法。 ✓ 细节增强算法。 ✓ 完整的源代码&#xff08;脚本和着色器&#xff09;。 ✓ 包含在“艺术包”中。 &#x1f…

【学术论文投稿】自动化运维:解锁高效运维的密钥

【连续三届IEEE出版|EI检索】第三届图像处理、计算机视觉与机器学习国际学术会议&#xff08;ICICML 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、自动化运维概述 1. 自动化运维的定义 2. 自动化运…

关于Docker

文章目录 DockerWSLWMWare虚拟机CentOS7安装dockerdocker基础命令docker数据卷挂载本地目录或文件 Docker Docker是一个快速构建、运行、管理应用的工具。 能够快速部署项目、项目依赖的组件、项目运行的环境。 项目传统的部署方式缺点&#xff1a; 各类环境、组件命令太多&…

科研进展 | RSE:全波形高光谱激光雷达数据Rclonte系列处理算法一

《环境遥感》&#xff08;Remote Sensing of Environment&#xff0c;IF11.1&#xff09;近日发表一项来自中国科学院空天信息创新研究院王力、牛铮研究员团队的全波形高光谱激光雷达&#xff08;hyperspectral LiDAR&#xff0c;HSL&#xff09;数据处理算法研究&#xff0c;论…

sentinel原理源码分析系列(八)-熔断

限流为了防止过度使用资源造成系统不稳&#xff0c;熔断是为了识别出”坏”资源&#xff0c;避免好的资源受牵连(雪崩效应)&#xff0c;是保证系统稳定性的关键&#xff0c;也是资源有效使用的关键&#xff0c;sentinel熔断插槽名称Degrade(降级)&#xff0c;本人觉得应该改为熔…

多级缓存-案例导入说明

为了演示多级缓存,我们先导入一个商品管理的案例,其中包含商品的CRUD功能。我们将来会给查询商品添加多级缓存。 1.安装MySQL 后期做数据同步需要用到MySQL的主从功能,所以需要大家在虚拟机中,利用Docker来运行一个MySQL容器。 1.1.准备目录 为了方便后期配置MySQL,我们…

docker sameersbn/bind dns服务器

1. 安装 #下载docker 镜像 docker pull sameersbn/bind#运行 53端口若被占用会启动失败 docker run --name dns -d --restartalways \ --publish 53:53/tcp \ --publish 53:53/udp \ --publish 10000:10000/tcp \ -v /etc/localtime:/etc/localtime \ -v /data/bind/:/data \…

ubuntu2204配置cuda

ubuntu2204配置cuda ✅系统版本&#xff1a;ubuntu22.04 LTS ✅显卡&#xff1a;英伟达2070S ✅CPU&#xff1a;i9 10900 ✅主板&#xff1a;戴尔品牌机 教程&#x1f4a8;&#x1f4a8;&#x1f4a8;&#x1f4a8;&#xff1a; ps&#xff1a;本人按照该方法一遍成功&#…

grafana 配置prometheus

安装prometheus 【linux】麒麟v10安装prometheus监控&#xff08;ARM架构&#xff09;-CSDN博客 登录grafana 访问地址&#xff1a;http://ip:port/login 可以进行 Grafana 相关设置&#xff08;默认账号密码均为 admin&#xff09;。 输入账户密码 添加 Prometheus 数据源…

【Axure高保真原型】标签管理可视化驾驶舱长页面案例

今天和大家分享标签管理可视化驾驶舱长页面案例的原型模板&#xff0c;包括我的工作、通告消息、标签总体调用趋势、标签应用业务场景对比、标签使用排名、各个标签使用情况……具体效果可以点击下方视频观看或打开下方预览地址查看哦 【原型效果】 【Axure高保真原型】标签管…

PhpSpreadsheet创建带复杂表头的excel数据

目录 一:背景 二&#xff1a;excel表头数据实现 三&#xff1a;excel渲染数据实现&#xff1a; 四&#xff1a;最终效果如下&#xff1a; 一:背景 最近需要统计一些数据&#xff0c;导出到excel&#xff0c;主要是一些区域的人员销售统计数据&#xff0c;涉及到复杂的表头和…