【牛客刷题】笔记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,一经查实,立即删除!

相关文章

网关挂了服务还能正常运行吗?

网关是现代架构&#xff08;尤其是在微服务架构中&#xff09;中的重要组件&#xff0c;负责处理客户端请求并将其路由到适当的服务。如果网关挂掉&#xff0c;通常会影响到系统的正常运行&#xff0c;但具体后果取决于系统的设计和架构。 网关挂掉后的影响 请求路由中断&…

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

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

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

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

【设计模式】深入理解Python中的桥接模式(Bridge Pattern)

深入理解Python中的桥接模式&#xff08;Bridge Pattern&#xff09; 在软件开发中&#xff0c;我们常常会遇到一个类随着功能的扩展&#xff0c;继承层次越来越复杂&#xff0c;导致系统僵化&#xff0c;难以维护。桥接模式&#xff08;Bridge Pattern&#xff09;提供了一种…

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;以及常用的万能句型…

鸿蒙 NEXT 开发:常用三方库与包管理

推荐列表 名称简介luvi/lv-markdown-inmarkdown 解析库ohos/axios符合前端开发习惯的 HTTP 请求库ohos/crypto-js加密算法库&#xff1a;crypto-js 已支持的算法有&#xff1a;MD5、SHA-1、SHA-256、HMAC、HMAC-MD5、HMAC-SHA1、HMAC-SHA256、PBKDF2、AES、RC4、DES 等。ohos/…

未来五年:IPD产品团队领航创新变革

在未来的五年里&#xff0c;产品开发的全新纪元将由那些深谙集成产品开发&#xff08;IPD&#xff09;精髓的团队开启。IPD&#xff0c;这一融合了市场导向、跨部门协作以及高效迭代理念的方法论&#xff0c;正逐步成为推动产品创新与产业升级的核心动力。在这个快速变化的时代…

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

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

10.21学习

1.格式说明符中的%2s 在 C 语言中&#xff0c; %2s 是一个格式说明符&#xff0c;用于 scanf 、 fscanf 、 sscanf 等输入函数中。它指定了函数应该读取的字符串的最大长度。具体来说&#xff1a; % &#xff1a;表示开始一个格式说明符。 2 &#xff1a;指定要读取的字符的…

Ajax:跨域、防抖和节流、HTTP协议

在善意的“双向奔赴”中&#xff0c;每个普通人都如星辰&#xff0c;微小但释放着自己的光芒&#xff0c;交织成灿烂的星河 文章目录 跨域防抖和节流HTTP协议HTP状态码以及代表意义错误代码的影响移动的小天使 跨域 同源策略 概念&#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;…

(c++)函数的引用语法、使用、函数调用作左值

//引用的用途&#xff1a;可以利用引用用形参修饰实参&#xff0c;引用的语法比指针操作地址更加简单易懂。 //1.不要返回局部的引用 2.如果函数返回的是引用&#xff0c;则这个函数调用可以作为左值 #include<iostream> using namespace std; //引用的用途&#xff1a;…

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

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

less 命令无法正确显示中文字符问题

less的配置文件通常是~/.lessfilter或~/.lessrc。你可以检查这些文件中是否有关于字符编码的设置。如果没有&#xff0c;可以添加以下内容到配置文件中&#xff1a; export LESSCHARSETutf-8&#xff08;设置字符编码为 UTF-8&#xff09;。 如果没有~/.lessfilter或~/.lessr…