代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

#695岛屿最大面积

模板题,很快.以下两种dfs,区别是看第一个点放不放到dfs函数中处理,那么初始化的area一个是1一个是0

int dir[4][2]={0,1,0,-1,1,0,-1,0};void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;if(!v[nextx][nexty] && grid[nextx][nexty]==1){v[nextx][nexty]=true;area++;dfs(nextx,nexty,n,m,area,v,grid);}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<bool>> v(n,vector<bool>(m,false));int area;int max=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!v[i][j] && grid[i][j]==1){v[i][j]=true;area=1;dfs(i,j,n,m,area,v,grid);max=std::max(max,area);}     }}return max;}
int dir[4][2]={0,1,0,-1,1,0,-1,0};void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){v[x][y]=true;area++;for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;if(!v[nextx][nexty] && grid[nextx][nexty]==1){v[nextx][nexty]=true;dfs(nextx,nexty,n,m,area,v,grid);}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<bool>> v(n,vector<bool>(m,false));int area;int max=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!v[i][j] && grid[i][j]==1){area=0;dfs(i,j,n,m,area,v,grid);max=std::max(max,area);}     }}return max;}

 bfs:对应也有两种

int dir[4][2]={0,1,0,-1,1,0,-1,0};void bfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){queue<pair<int,int>> que;que.push({x,y});while(!que.empty()){auto cur=que.front(); que.pop();int curx=cur.first; int cury=cur.second;for(int i=0;i<4;i++){int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;if(!v[nextx][nexty] && grid[nextx][nexty]==1){v[nextx][nexty]=true;area++;que.push({nextx,nexty});}}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<bool>> v(n,vector<bool>(m,false));int area;int max=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!v[i][j] && grid[i][j]==1){v[i][j]=true;area=1;bfs(i,j,n,m,area,v,grid);max=std::max(max,area);}     }}return max;}
int dir[4][2]={0,1,0,-1,1,0,-1,0};void bfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){queue<pair<int,int>> que;que.push({x,y});v[x][y]=true;area++;while(!que.empty()){auto cur=que.front(); que.pop();int curx=cur.first; int cury=cur.second;for(int i=0;i<4;i++){int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;if(!v[nextx][nexty] && grid[nextx][nexty]==1){v[nextx][nexty]=true;area++;que.push({nextx,nexty});}}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<bool>> v(n,vector<bool>(m,false));int area;int max=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!v[i][j] && grid[i][j]==1){//v[i][j]=true;area=0;bfs(i,j,n,m,area,v,grid);max=std::max(max,area);}     }}return max;}

#1020飞地的数量

下面是自己写的dfs,过了但是很多可以改进。bfs也差不多这里就不写了 

int dir[4][2]={0,1,0,-1,1,0,-1,0};void dfs(int x, int y, vector<vector<int>>& grid, vector<vector<bool>> &v, int &cnt){for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()) continue;if(!v[nextx][nexty]&&grid[nextx][nexty]==1){v[nextx][nexty]=true;cnt++;dfs(nextx,nexty,grid,v,cnt);}}}int numEnclaves(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<bool>> v(n,vector<bool>(m,false));int totalcnt=0;int cnt=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==1) totalcnt++;}}for(int j=0; j<m; j++){// Do something with grid[0][j]if(!v[0][j]&&grid[0][j]==1){v[0][j]=true;cnt++;dfs(0,j,grid,v,cnt);}}for(int j=0; j<m; j++){// Do something with grid[n-1][j]if(!v[n-1][j]&&grid[n-1][j]==1){v[n-1][j]=true;cnt++;dfs(n-1,j,grid,v,cnt);}}for(int i=1; i<n-1; i++){// Do something with grid[i][0]if(!v[i][0]&&grid[i][0]==1){v[i][0]=true;cnt++;dfs(i,0,grid,v,cnt);}}for(int i=1; i<n-1; i++){// Do something with grid[i][m-1]if(!v[i][m-1]&&grid[i][m-1]==1){v[i][m-1]=true;cnt++;dfs(i,m-1,grid,v,cnt);}}return totalcnt-cnt;}

可改进的点: 1 其实遍历四周可以四个循环合为两个 

2. 不需要维护一个visited, 直接把遍历过的可以走的陆地变成0海洋 有点巧妙

随想录: 

int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; int count; // 统计符合题目要求的陆地空格数量void dfs(vector<vector<int>>& grid, int x, int y) {grid[x][y] = 0;count++;for (int i = 0; i < 4; i++) { // 向四个方向遍历int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if (grid[nextx][nexty] == 0) continue;dfs (grid, nextx, nexty);}return;}public:int numEnclaves(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();// 从左侧边,和右侧边 向中间遍历for (int i = 0; i < n; i++) {if (grid[i][0] == 1) dfs(grid, i, 0);if (grid[i][m - 1] == 1) dfs(grid, i, m - 1);}// 从上边和下边 向中间遍历for (int j = 0; j < m; j++) {if (grid[0][j] == 1) dfs(grid, 0, j);if (grid[n - 1][j] == 1) dfs(grid, n - 1, j);}count = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1) dfs(grid, i, j);}}return count;}

#130被围绕的区域

和1020飞地是反过来的。但一开始自己想不到如何只遍历里面的。看来是做不到的,还是要靠先遍历外面。随想录思路用了第三个符号来标记(确实是三种地,内地,外地,海洋),很巧妙

想练习一下bfs,因为比dfs复杂,我总是会出小错误。bfs代码:

自己实现了25min左右吧,感觉代码确实长,东西也多,我还容易出小错误

int dir[4][2]={0,1,0,-1,1,0,-1,0};void bfs(int x, int y, vector<vector<char>>& board, char oldc,char newc){queue<pair<int,int>> que;que.push({x,y});board[x][y]=newc;while(!que.empty()){auto cur=que.front();que.pop();int curx=cur.first;int cury=cur.second;for(int i=0;i<4;i++){int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size()) continue;if(board[nextx][nexty]==oldc){que.push({nextx,nexty});board[nextx][nexty]=newc;}}}}void solve(vector<vector<char>>& board) {int n=board.size();int m=board[0].size();//itr around land,set Afor(int j=0;j<m;j++){if(board[0][j]=='O') bfs(0,j,board,'O','A');if(board[n-1][j]=='O') bfs(n-1,j,board,'O','A');}for(int i=1;i<n-1;i++){if(board[i][0]=='O') bfs(i,0,board,'O','A');if(board[i][m-1]=='O') bfs(i,m-1,board,'O','A');}//go through all, o to xfor(int i=0;i<n;i++){for(int j=0;j<m;j++){if(board[i][j]=='O') bfs(i,j,board,'O','X');}}//go through all, A to ofor(int i=0;i<n;i++){for(int j=0;j<m;j++){if(board[i][j]=='A') bfs(i,j,board,'A','O');}}}

出错1:忘记检查边界&continue了。记住出现runtime error很有可能就是忘记检查边界了

出错2:多个循环,相互复制,要记得改里面的i,j, char之类的!不要复制了忘记改了呜呜


#417太平洋大西洋水流问题 

有思路,写出来有问题,看了随想录调整的,就过了。弄了四十多分钟

这回基本上都是逻辑思路问题,没有模板问题:

1.我想到了是从边缘逆着流上来。我原来没想到本题是两个visited,都是true就没错。

错的:我额外弄了一个叫top的2d,每次++。但有可能都从pac溜上来的两条路都可以++:

2.我原来很疑惑怎么找到一条路的末尾,其实在这道题不用找。直接两个表都是true的点就是

3. 我没想明白为什么在主函数里,不用判断这些://if(!pac[0][j]),加了也没错但反而慢

int dir[4][2]={0,1,0,-1,1,0,-1,0};void dfs(int x, int y,vector<vector<bool>> &v,vector<vector<int>>& vec){v[x][y]=true;for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<0||nextx>=vec.size()||nexty<0||nexty>=vec[0].size()) continue;if(!v[nextx][nexty] && vec[nextx][nexty]>=vec[x][y]){v[nextx][nexty]=true;dfs(nextx,nexty,v,vec);}}}vector<vector<int>> pacificAtlantic(vector<vector<int>>& vec) {int n=vec.size();int m=vec[0].size();vector<vector<bool>> pac(n, vector<bool>(m, false));vector<vector<bool>> atl(n, vector<bool>(m, false));vector<vector<int>> res;//left, topfor(int j=0;j<m;j++){//if(!pac[0][j]) dfs(0,j,pac,vec);dfs(0,j,pac,vec);}for(int i=0;i<n;i++){//if(!pac[i][0]) dfs(i,0,pac,vec);dfs(i,0,pac,vec);}//right bottomfor(int j=0;j<m;j++){//if(!atl[n-1][j]) dfs(n-1,j,atl,vec);dfs(n-1,j,atl,vec);}for(int i=0;i<n;i++){//if(!atl[i][m-1]) dfs(i,m-1,atl,vec);dfs(i,m-1,atl,vec);}//check resfor(int i=0;i<n;i++){for(int j=0;j<m;j++){if(pac[i][j]&&atl[i][j]){res.push_back({i,j});}}}return res;}

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

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

相关文章

2023最新谷粒商城笔记之Sentinel概述篇(全文总共13万字,超详细)

Sentinel概述 服务流控、熔断和降级 什么是熔断 当扇出链路的某个微服务不可用或者响应时间太长时&#xff0c;会进行服务的降级&#xff0c;**进而熔断该节点微服务的调用&#xff0c;快速返回错误的响应信息。**检测到该节点微服务调用响应正常后恢复调用链路。A服务调用B服…

构建高效供应商管理体系,提升企业采购能力

随着企业采购规模的不断扩大和全球化竞争的加剧&#xff0c;供应商管理变得越来越重要。构建一个高效的供应商管理体系是企业提升采购能力、降低采购成本的关键一环。本文将重点探讨供应商管理体系的意义和作用&#xff0c;并介绍如何构建一个高效的供应商管理体系。 一、供应商…

SpringBoot复习:(1)常用的SpringApplication.run返回的容器的具体类型是哪个?

run方法中调用了createApplicationContext方法 createApplicationContext方法代码如下&#xff1a; 其中create代码如下&#xff1a; 可见返回的是AnnotationConfigServletWebServerApplicationContext()

【搜索引擎Solr】配置 Solr 以获得最佳性能

Apache Solr 是广泛使用的搜索引擎。有几个著名的平台使用 Solr&#xff1b;Netflix 和 Instagram 是其中的一些名称。我们在 tajawal 的应用程序中一直使用 Solr 和 ElasticSearch。在这篇文章中&#xff0c;我将为您提供一些关于如何编写优化的 Schema 文件的技巧。我们不会讨…

基于Python+WaveNet+CTC+Tensorflow智能语音识别与方言分类—深度学习算法应用(含全部工程源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Tensorflow 环境 模块实现1. 方言分类数据下载及预处理模型构建模型训练及保存 2. 语音识别数据预处理模型构建模型训练及保存 3. 模型测试功能选择界面语言识别功能实现界面方言分类功能实现界面 系统测试1. 训…

【RabbitMQ(day1)】RabbitMQ的概述和安装

入门RabbitMQ 一、RabbitMQ的概述二、RabbitMQ的安装三、RabbitMQ管理命令行四、RabbitMQ的GUI界面 一、RabbitMQ的概述 MQ&#xff08;Message Queue&#xff09;翻译为消息队列&#xff0c;通过典型的【生产者】和【消费者】模型&#xff0c;生产者不断向消息队列中生产消息&…

【DDD】业务领域定义

文章目录 前言一、什么是业务子领域&#xff1f;二、子领域的类型有哪些&#xff1f;2.1、核心子领域2.2、通用子领域2.3、支撑子领域 三、子领域差异对比3.1、竞争优势比较3.2、复杂性比较3.3、易变性比较3.4、实时策略比较 总结 前言 一个业务领域是一个公司的主要活动领域的…

redis(11):springboot中使用redis

1 创建springboot项目 2 创建pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

vue3+Luckysheet实现表格的在线预览编辑(electron可用)

前言&#xff1a; 整理中 官方资料&#xff1a; 1、github 项目地址https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/ 2、xlsx vue3 json数据导出excel_vue3导出excel_羊…

【SpirngCloud】分布式事务解决方案

【SpirngCloud】分布式事务解决方案 文章目录 【SpirngCloud】分布式事务解决方案1. 理论基础1.1 CAP 理论1.2 BASE 理论1.3 分布式事务模型 2. Seata 架构2.1 项目引入 Seata 3. 强一致性分布式事务解决方案3.1 XA 模式3.1.1 seata的XA模式3.1.2 XA 模式实践3.1.3 总结 4. 最终…

React AntDesign表批量操作时的selectedRowKeys回显选中

不知道大家是不是在AntDesign的某一个列表想要做一个批量导出或者操作的时候&#xff0c;发现只要选择下一页&#xff0c;即使选中的ids 都有记录下面&#xff0c;但是就是不回显 后来问了chatGPT&#xff0c;对方的回答是&#xff1a; 在Ant Design的DataTable组件中&#xf…

什么是框架?为什么要学框架?

一、什么是框架 框架是整个或部分应用的可重用设计&#xff0c;是可定制化的应用骨架。它可以帮开发人员简化开发过程&#xff0c;提高开发效率。 项目里有一部分代码&#xff1a;和业务无关&#xff0c;而又不得不写的代码>框架 项目里剩下的部分代码&#xff1a;实现业务…

基于C++的QT基础教程学习笔记

文章目录&#xff1a; 来源 教程社区 一&#xff1a;QT下载安装 二&#xff1a;注意事项 1.在哪里写程序 2.如何看手册 3.技巧 三&#xff1a;常用函数 1.窗口 2.相关 3.按钮 4.信号与槽函数 5.常用栏 菜单栏 工具栏 状态栏 6.铆接部件 7.文本编辑 8…

Docker Compose(九)

一、背景&#xff1a; 对于现代应用来说&#xff0c;大多数都是通过很多的微服务互相协同组成一个完整的应用。例如&#xff0c;订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;他们构成了一个电商平台的应用。而部署和管理大量的服务容器是一件非常繁琐的事…

【时间复杂度】

旋转数组 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 /* 解题思路&#xff1a;使用三次逆转法&#xff0c;让数组旋转k次 1. 先整体逆转 // 1,2,3,4,5,6,7 // 7 6 5 4 3 2 1 2. 逆转子数组[0, k - 1] // 5 6 7 4 3…

疲劳驾驶检测和识别2:Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码)

疲劳驾驶检测和识别2&#xff1a;Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 目录 疲劳驾驶检测和识别2&#xff1a;Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 1.疲劳驾驶检测和识别方法 2.疲劳驾驶数据集 &#xff08;1&#xff09;疲…

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6:MySQL Enterprise Monitor之Query Analyzer

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6&#xff1a;MySQL Enterprise Monitor之Query AnalyzerMySQL Enterprise Monitor之Query AnalyzerQuery Response Time index (QRTi)例题例题1: Query Analyzer答案与解析1 参考 【免责声明】文章仅供学习交流&#x…

vue中如何通过webpack-bundle-analyzer打包分析工具进行配置优化

vue中随着项目的不断功能迭代和开发&#xff0c;项目文件越来越多&#xff0c;项目的打包文件也越来越大。如何对打包文件进行分析优化&#xff0c;减小打包文件大小呢&#xff1f;可以通过webpack-bundle-analyzer 这个打包分析工具进行解决。 1、webpack-bundle-analyzer的安…

Python Flask构建微信小程序订餐系统 (十一)

🔥 已经删除的会员不允许进行编辑昵称 🔥 🔥 已经删除的会员要隐藏掉会员信息的编辑按钮 🔥 🔥 创建商品表 food 🔥 CREATE TABLE `food` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`cat_id` int(11) NOT NULL DEFAULT 0 COMMENT 分类id,`name` varchar…

【算法题解】51. 二叉树的最近公共祖先

这是一道 中等难度 的题 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为…