图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积

力扣题目链接(opens new window)

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

  • 输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
  • 输出:6
  • 解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。

思路:广度优先和深度优先皆可,遍历的时候计数,然后取最大数量即可

class Solution {
public://深度优先版本int count=0;int result =0;int dir[4][2]={0,1,1,0,-1,0,0,-1};void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){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(!visited[nextx][nexty] && grid[nextx][nexty] == 1){visited[nextx][nexty]=true;count++;dfs(grid,visited,nextx,nexty);}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n=grid.size(); int m=grid[0].size();vector<vector<bool>>visited=vector<vector<bool>>(n,vector<bool>(m,false));for(int i=0;i<n;i++){for(int j=0; j<m;j++){if(!visited[i][j]&&grid[i][j]==1){count=1;//遇到陆地先计数visited[i][j]=true;dfs(grid,visited,i,j);result=max(result,count);}}}return result;}
};
//广度优先版本
class Solution {
public:int count=0;int result =0;int dir[4][2]={0,1,1,0,-1,0,0,-1};void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){queue<int>que;que.push(x);que.push(y);visited[x][y]=true;count++;while(!que.empty()){int xx=que.front(); que.pop();int yy=que.front(); que.pop();for(int i=0;i<4;i++){int nextx=  xx+dir[i][0];int nexty=  yy+dir[i][1];if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size())continue;if(!visited[nextx][nexty] && grid[nextx][nexty] == 1){visited[nextx][nexty]=true;count++;que.push(nextx);que.push(nexty);}}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int n=grid.size(); int m=grid[0].size();vector<vector<bool>>visited=vector<vector<bool>>(n,vector<bool>(m,false));for(int i=0;i<n;i++){for(int j=0; j<m;j++){if(!visited[i][j]&&grid[i][j]==1){count=0;visited[i][j]=true;dfs(grid,visited,i,j);result=max(result,count);}}}return result;}
};

1020. 飞地的数量

力扣链接(opens new window)

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

  • 输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
  • 输出:3
  • 解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。

  • 输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
  • 输出:0
  • 解释:所有 1 都在边界上或可以到达边界

思路:本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图的时候,统计此时还剩下的陆地就可以了。

遍历周边:分别遍历最左列(grid[i][0]),最右列(grid[i][m-1]),最上行(grid[0][j]),最下行(grid[n-1][j]),同时进行搜索,在搜索过程中将其置0。

class Solution {
public://深度优先搜索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]==1){// count++;// grid[nextx][nexty]=0;dfs(grid, nextx, nexty);}}return;}int numEnclaves(vector<vector<int>>& grid) {// int count=0;int n=grid.size();//行数int m=grid[0].size();//列数//遍历周边for(int i=0;i<n;i++){if(grid[i][0])dfs(grid, i,0);//遍历最左列if(grid[i][m-1])dfs(grid,i, m-1);//遍历最右列}for(int j=0; j<m;j++){if(grid[0][j])dfs(grid, 0, j);//遍历最上行if(grid[n-1][j])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]){// count++;dfs(grid,i, j);}}}return count;}
};
//广度优先搜索
class Solution {
public:int count =0;int dir[4][2]={0,1,1,0,0,-1,-1,0};void bfs(vector<vector<int>>& grid, int x, int y){queue<pair<int,int>>que;que.push({x,y});count++;grid[x][y]=0;while(!que.empty()){pair<int,int>cur=que.front();que.pop();for(int i=0;i<4;i++){int nextx=cur.first+dir[i][0];int nexty=cur.second+dir[i][1];if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size())continue;if(grid[nextx][nexty]){que.push({nextx,nexty});count++;grid[nextx][nexty]=0;}}}return;}int numEnclaves(vector<vector<int>>& grid) {int n=grid.size();//行数int m=grid[0].size();//列数//遍历周边并置0for(int i=0;i<n;i++){if(grid[i][0])bfs(grid,i,0);//遍历最左列if(grid[i][m-1])bfs(grid,i,m-1);//遍历最右列}for(int j=0;j<m;j++){if(grid[0][j]) bfs(grid,0,j);//遍历第一行if(grid[n-1][j]) bfs(grid,n-1,j);//遍历最后一行}//重新遍历整个网格并计算count=0;for(int i=0; i<n;i++) {for(int j=0;j<m;j++){if(grid[i][j]){bfs(grid,i,j);}}}return count;}
};

130. 被围绕的区域

题目链接(opens new window)

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

  • 输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
  • 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
  • 解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的

思路:和上一题类似,只是需要把’飞地‘改为”X"

先广度优先或深度优先遍历周边,把周边的X换为'A',然后两个for循环遍历整个grid,遇到'A'换成’O',遇到'O'换成‘X'

//广度优先搜索
class Solution {
public:int dir[4][2]={0,1,1,0,0,-1,-1,0};void dfs(vector<vector<char>>& board, int x, int y){board[x][y]='A';for(int i=0;i<4;i++){int nextx=x+dir[i][0];int nexty=y+dir[i][1];if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size())continue;if(board[nextx][nexty]=='O'){dfs(board,nextx,nexty);}}return;}void solve(vector<vector<char>>& board) {int n=board.size();//行数int m=board[0].size();//列数//遍历周边,把周边的'O'换成’A‘for(int i=0;i<n;i++){if(board[i][0]=='O')dfs(board,i,0);//遍历最左列if(board[i][m-1]=='O')dfs(board,i,m-1);//遍历最右列}for(int j=0;j<m;j++){if(board[0][j]=='O')dfs(board,0,j);//最上行if(board[n-1][j]=='O')dfs(board,n-1,j);//最下行}//遍历整个网格并替换for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(board[i][j]=='O')board[i][j]='X';if(board[i][j]=='A') board[i][j]='O';}}}
};
class Solution {
public:int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};void bfs(vector<vector<char>>& board, int x, int y) {queue<pair<int, int>> que;que.push({x, y});board[x][y]='A';while (!que.empty()) {pair<int, int> cur = que.front();que.pop();for (int i = 0; i < 4; i++) {int nextx = cur.first + dir[i][0];int nexty = cur.second + dir[i][1];if (nextx < 0 || nextx >= board.size() || nexty < 0 ||nexty >= board[0].size())continue;if (board[nextx][nexty] == 'O') {board[nextx][nexty] = 'A';// cout<<"board[nextx][nexty]:"<<board[nextx][nexty]<<endl;que.push({nextx, nexty});}}}}void solve(vector<vector<char>>& board) {int n = board.size();int m = board[0].size();// 遍历周边for (int i = 0; i < n; i++) {if (board[i][0] == 'O')bfs(board, i, 0);if (board[i][m - 1] == 'O')bfs(board, i, m - 1);}for (int j = 0; j < m; j++) {if (board[0][j] == 'O')bfs(board, 0, j);if (board[n - 1][j] == 'O')bfs(board, n - 1, j);}// 遍历整个网格并替换for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {// cout<<"before: "<<board[i][j]<<endl;if (board[i][j] == 'O')board[i][j] = 'X';if (board[i][j] == 'A')board[i][j] = 'O';}}}
};

 参考:代码随想录

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

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

相关文章

C语言操作符和数据类型的存储详解

CSDN成就一亿技术人 目录​​​​​​​ 一.操作符 一.算数操作符&#xff1a; 二.位移操作符&#xff1a; 三.位操作符&#xff1a; 四.赋值操作符&#xff1a; 五.单目操作符&#xff1a; 六.关系操作符&#xff1a; 七.逻辑操作符&#xff1a; 八.条件操作符&…

蓝桥杯day5刷题日记-分巧克力-天干地支-求和

P8647 [蓝桥杯 2017 省 AB] 分巧克力 思路&#xff1a;二分查找 #include <iostream> using namespace std; int n,k; int h[100010],w[100010];bool check(int x) {int sum0;for(int i0;i<n;i){sum(h[i]/x)*(w[i]/x);if(sum>k) return true;}return false; }int…

FFMpeg 获取音频音量、提高音量

查看音量 准备原生音频original.mp3 查看original.mp3的音量信息&#xff1a; ffmpeg -i original.mp3 -filter_complex volumedetect -c:v copy -f null /dev/null输出&#xff1a; Input #0, mp3, from original.mp3:Metadata:artist : Administratorencoder …

【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录 Redis 介绍 Redis 为什么这么快&#xff1f; Redis数据结构 Redis 和Memcache区别 &#xff1f; 为何Redis单线程效率也高&#xff1f; Redis 介绍 Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据…

前端基础篇-前端工程化 Vue 项目开发流程(环境准备、Element 组件库、Vue 路由、项目打包部署)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 环境准备 1.1 安装 NodeJs 1.2 验证 NodeJs 环境变量 1.3 配置 npm 的全局安装路径 1.4 切换 npm 的淘宝镜像( npm 使用国内淘宝镜像的方法(最新) ) 1.5 查看镜像…

【C语言】——指针四:字符指针与函数指针变量

【C语言】——指针四&#xff1a;字符指针与函数指针变量 一、字符指针二、函数指针变量2.1、 函数指针变量的创建2.2、两段有趣的代码 三、typedef关键字3.1、typedef的使用3.2、typedef与define比较 四、函数指针数组 一、字符指针 在前面的学习中&#xff0c;我们知道有一种…

解码新时代内存架构:探秘数据在内存中的灵动驻足

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 随着信息技术的飞速发展&#xff0c;我们身处一个数据爆炸的时代。数据的处理和存储方式正日益成为技术革新的重要领域。在新时代的…

c++学习笔记(9)

1. 在 C 中&#xff0c;表达式 (i & 1) 是一个位运算表达式。它使用了按位与操作符 & 来对变量 i 和数字 1 进行二进制的按位与操作。 按位与操作符 & 会比较两个数的二进制表示中的对应位&#xff0c;如果两个相应的二进制位都为 1&#xff0c;则该位的结果值为…

CSS时钟案例

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 背景是表盘&#xff0c;不用自己制作然后用CSS的定位做时针&#xff0c;分针和秒针黑点用伪元素::after生成转动用animation实现 3. 代码实现 <!DOCTYPE html> <html lang"en">&…

Java学习笔记 | JavaSE基础语法05 | 方法

文章目录 0.前言1. 方法概述2. 方法的定义和调用2.1 无参数方法定义和调用2.2 带参数方法定义和调用1 带参数方法定义和调用2 形参和实参3 带参数方法练习 2.3 带返回值方法的定义和调用1 带返回值方法定义和调用2 带返回值方法练习13 带返回值方法练习24 带返回值方法练习3 3.…

vim | vim的快捷命令行

快捷进入shell界面 -> :nnoremap <F8> :sh<CR> -> 绑定到了F8 :nnoremap <F8> :sh<CR> 快捷执行 -> :nnoremap <F5> :wa<CR>:!g % -o a.out && ./a.out<CR> -> 绑定到了F5 :nnoremap <F5> :wa<CR>…

【Prometheus】查询数据接口

文章目录 1. 前言1.1. API终端1.2. API状态码说明1.3. API请求返回的格式均使用以下的 JSON 格式2. API接口文档2.1. 查询时间点结果2.1.1. 请求类型2.1.2. URL2.1.3. 请求参数2.1.4. 返回2.1.5. 实例2.2. 查询时间范围结果2.2.1. 请求类型2.2.2. URL2.2.3. 请求参数2.2.3.1. s…

Python学习从0到1 day18 Python可视化基础综合案例 1.折线图

我默记这段路的酸楚&#xff0c;等来年春暖花开之时再赏心阅读 —— 24.3.24 python基础综合案例 数据可视化 — 折线图可视化 一、折线图案例 1.json数据格式 2.pyecharts模块介绍 3.pyecharts快速入门 4.数据处理 5.创建折线图 1.json数据格式 1.什么是json 2.掌握如何使用js…

SqlServer找不到SQL Server Configuration Manager(配置管理)

1、Win键 R &#xff0c;输入 compmgmt.msc 2、找到Sql Server配置管理器

代码随想录-动态规划15(392. 判断子序列、115. 不同的子序列)

392. 判断子序列 class Solution { public:bool isSubsequence(string s, string t) {int m s.size();int n t.size();vector<vector<int>> dp(m1, vector<int>(n1));for (int i1; i<m; i)for (int j1; j<n; j){if (s[i-1]t[j-1]) dp[i][j] dp[i-1…

函数模板及注意事项

一、函数模板 C另一种编程思想称为泛型编程&#xff0c;主要利用的技术就是模板 C提供两种模板机制&#xff1a;函数模板和类模板 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语…

nginx localtion 匹配规则

1、语法规则 语法规则&#xff1a;location[|~|^~*|^~]/uri/{… } 表示精确匹配,这个优先级也是最高的 ^~ 表示 uri 以某个常规字符串开头&#xff0c;理解为匹配 url 路径即可。 nginx 不对 url 做编码&#xff0c;因此请求为 /image/20%/aa&#xff0c;可以被规则^~ /imag…

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备&#xff0c;为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning

开头说点题外话&#xff1a;这篇可谓是大咖云集啊&#xff0c;刘壮、谢赛宁、何凯明这些耳熟能详的名字&#xff0c;并且这篇论文一些人也觉得分析特别到位&#xff0c;不愧是大佬视角&#xff0c;配得上“解构”两个字&#xff1b;很巧的是&#xff0c;本科阶段的团队导师也是…

Web框架开发-Ajax

一、 Ajax准备知识:json 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式 1 2 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。…