【牛客刷题】笔记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.mzph.cn/web/56140.shtml

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

相关文章

PHP露营地管理小程序系统源码

&#x1f3d5;️露营新风尚&#xff01;露营地管理小程序系统&#xff0c;打造完美露营体验✨ &#x1f4cd;营地预订&#xff0c;轻松搞定&#x1f4c5; 想要逃离城市的喧嚣&#xff0c;享受大自然的宁静&#xff1f;露营地管理小程序系统让你的露营计划轻松实现&#xff01…

判断网站需不需要改版的几个要点

判断一个网站是否需要改版&#xff0c;可以从多个维度进行分析。以下是一些关键要点&#xff1a; 用户体验&#xff1a; 访问速度&#xff1a;如果网站加载缓慢&#xff0c;用户可能会感到沮丧并离开。导航性&#xff1a;网站结构是否清晰&#xff0c;用户是否能够轻松找到所需…

WebGL编程指南 - 绘制和变换三角形

三角形在三维图形学中的重要地位&#xff0c;以及WebGL如何绘制三角形。使用多个三角形绘制其它类型的基本图形。利用简单的方程对三角形做基本的变换&#xff0c;如移动、旋转和缩放。利用矩阵简化变换。 绘制多个点与缓冲区对象 相关内容&#xff1a;缓冲区对象&#xff1a;创…

第J6周:ResNeXt-50实战解析(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 任务&#xff1a; ●阅读ResNeXt论文&#xff0c;了解作者的构建思路 ●对比我们之前介绍的ResNet50V2、DenseNet算法 ●使用ResNeX…

LabVIEW离心泵振动监控与诊断系统

利用LabVIEW结合数据采集与处理技术&#xff0c;构建了一套高效、低成本的振动监测与诊断系统&#xff0c;有效提升了测试精度与设备可靠性。 项目背景 在化工生产中&#xff0c;离心泵作为关键设备&#xff0c;其稳定运行对保障生产安全与效率至关重要。由于传统振动测试系统…

C++ —— set系列的使用

目录 1. 序列式容器和关联式容器 2. set和multiset参考⽂档 3. set类的介绍 4. set的构造和迭代器 4.1 set的增删查 4.1.1 插入 4.1.2 查找 4.1.3 删除 5. multiset和set的差异 1. 序列式容器和关联式容器 前⾯我们已经接触过STL中的部分容器如&#xff1a;str…

大学英语四级作文模板万能句型开头主体结尾PDF

大学英语四级笔试时间越来越近了&#xff0c;报名了英语四级的宝子要抓紧咯&#xff0c;今天给大家分享一份实用的英语四级作文模板&#xff0c;看到了就赶紧背&#xff0c;不要等到考完试才后悔没背 … 万能作文模板涵盖开头、主体和结尾的写法&#xff0c;以及常用的万能句型…

股票交易基础规则系列—集合竞价撮合/价格确定原则,连续竞价价格确定原则! 集合竞价和连续竞价的价格是怎么确定的?

竞价交易的撮合原则 证券竞价交易按价格优先、时间优先的原则撮合成交。 成交时价格优先的原则为&#xff1a;较高价格买入申报优先于较低价格买入申报&#xff0c;较低价格卖出申报优先于较高价格卖出申报。——买单价高优先&#xff0c;卖单价低优先。 成交时时间优先的原…

RAID5数据恢复—raid5阵列如何重组?raid5阵列重组方法详解

RAID5数据恢复环境&#xff1a; 一台存储上有一组由12块SCSI硬盘&#xff08;11块数据盘1块热备盘&#xff09;组建的RAID5磁盘阵列&#xff0c;FreeBSD操作系统zfs文件系统。 RAID5故障&#xff1a; 其中一块盘出现故障&#xff0c;需要重组该raid5磁盘阵列。 RAID5数据恢复…

MySQL数据库操作——(4)

目录 8 视图 8.1 常见的数据库对象 8.2 视图概述 8.2.1 为什么使用视图&#xff1f; 8.2.2 视图的理解 8.3 创建视图 8.3.1 创建单表视图 8.3.2 创建多表联合视图 8.3.3 基于视图创建视图 8.4 查看视图 8.5 更新视图的数据 8.5.1 一般情况 8.6 修改、删除视图 8.…

冲锋衣市场洞察:全方位数据分析与趋势展望

冲锋衣整体数据分析 一. 概述 本报告基于从淘宝商品搜索接口和淘宝精确月销量接口中提取的数据&#xff0c;分析了前百个品牌在销售额上的占比情况。分析涵盖了销售额和占比的数据&#xff0c;为决策提供了依据。&#xff08;数据获取时间&#xff1a;2024.10.08&#xff09;…

leetcode动态规划(十)-0-1背包理论基础(一维数组)

一维dp数组&#xff08;滚动数组&#xff09; leetcode中无纯0-1背包问题&#xff0c;可从卡码网上查看题目46.0-1背包问题 一维数组来源于二维数组&#xff0c;其本质是对一维数组进行压缩了&#xff0c;压缩后需要注意在进行背包容量循环的时候采用后序遍历&#xff0c;而不…

世界500强,计算机校招月薪 1k ?

大家好&#xff0c;我是鸭鸭&#xff01; 周末闲来无事&#xff0c;鸭鸭又来互联网冲浪了&#xff0c;没想到刷到这么一张图&#xff1a; 现在校招给计算机应届生开出的薪资只有 1&#xff5e;1k 了吗&#xff1f;鸭鸭很难不怀疑这是打错字了。 根据图里信息&#xff0c;这应…

【数据库设计】逻辑结构设计

E-R实体集的转换 概念结构设计之后就是对E-R图进行逻辑结构设计&#xff1a;即将E-R图转化成关系的过程。逻辑结构设计主要用于数据库管理系统上&#xff0c;为了让数据在计算机系统中更好地表示。 此设计过程用到的数据模型有&#xff1a;除了前面讲过的关系模型还有层次模型…

双十一该买什么比较好?双十一推荐好物清单分享

​是不是很多朋友跟我一样&#xff0c;已经为双11做好了准备&#xff0c;打算开启买买买的节奏&#xff01;作为一名家居兼数码博主&#xff0c;每年双11的时候都会疯狂囤很多物品&#xff0c;所以今天就跟大家来分享一下&#xff0c;我的双11购物清单&#xff0c;也给大家参考…

数据结构部分混淆

1.随机存储和顺序存储&#xff1a; 随机存取&#xff1a;数组&#xff0c;当存储器中的数据被读取或写入时&#xff0c;所需要的时间与该数据所在的物理地址无关 顺序存取&#xff1a;链表&#xff0c;当存储器中的数据被读取或写入时&#xff0c;所需要的时间与该数据所在的物…

Java:IDEA生成JavaDoc文档

有些开源项目并未直接提供api&#xff0c;但是通过从github、gitee下载项目可以手动生成Java文档。 步骤如下。 使用IDEA打开项目。 选择生成Java Doc文档&#xff1a; 第一步&#xff1a;选择生成JavaDoc文档的范围&#xff0c;我只对一个源文件生成Doc&#xff0c;所以选择…

鸿蒙开发超好用的 UI 组件和工具类库 BasicLibrary

大家好&#xff0c;我是 V 哥。你在学习HarmonyOS NEXT 开发吗&#xff0c;今天 V 哥给你推荐一款超好用的三方库BasicLibrary&#xff0c;BasicLibrary 是一个基于 API 11 封装的基本库&#xff0c;旨在提升鸿蒙开发效率。它包含了一些常用的 UI 组件和实用工具类&#xff0c;…

Java基础:面向对象编程8

1 Java 注解 1.1 概念 定义&#xff1a;注解&#xff08;Annotation&#xff09;是在 Java 1.5 时引入的概念&#xff0c;同 class 和 interface 一样&#xff0c;属于一种类型。作用&#xff1a;注解提供了一系列数据用来装饰程序代码&#xff08;类、方法、字段等&#xff…

git配置以及如何删除git

你努力学习和充实自己&#xff0c;除了提升自身的价值&#xff0c;最实际的是当遇到有喜欢的人和事的时候&#xff0c;除了一片真心&#xff0c;还有拿得出手的东西 作用 记录开发的历史&#xff0c;每次记录就是一个版本&#xff0c;而且可以回到历史的某个版本可以实现多人合…