当前位置: 首页 > news >正文

[100天算法】-统计封闭岛屿的数目(day 74)

题目描述

有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。请返回封闭岛屿的数目。输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
输出:2
解释:
灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。
输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
输出:1
输入:grid = [[1,1,1,1,1,1,1],[1,0,0,0,0,0,1],[1,0,1,1,1,0,1],[1,0,1,0,1,0,1],[1,0,1,1,1,0,1],[1,0,0,0,0,0,1],[1,1,1,1,1,1,1]]
输出:2

思路

先把跟边界连通的 0 变成 1 (或者其他占位符),然后计算其他连通的 0 有多少组。

复杂度

  • 时间复杂度:$O(m*n)$,m 和 n 是 grid 的长宽。
  • 空间复杂度:$O(max(m, n))$,递归栈的空间我感觉是这个。

代码

JavaScript Code

/*** @param {number[][]} grid* @return {number}*/
var closedIsland = function (grid) {const outOfBoundary = (grid, x, y) =>x < 0 || x >= grid.length || y < 0 || y >= grid[0].length;const dfs = (grid, x, y) => {if (outOfBoundary(grid, x, y)) return false;if (grid[x][y] === 1) return true;grid[x][y] = 1;if (dfs(grid, x - 1, y) &&dfs(grid, x + 1, y) &&dfs(grid, x, y - 1) &&dfs(grid, x, y + 1))return true;return false;};const mark = (grid, x, y) => {if (outOfBoundary(grid, x, y) || grid[x][y] === 1) return;grid[x][y] = 1;mark(grid, x - 1, y);mark(grid, x + 1, y);mark(grid, x, y - 1);mark(grid, x, y + 1);};// 将连通边界的 0 都改成 1for (let i = 0; i < grid.length; i++) {mark(grid, i, 0);mark(grid, i, grid[0].length - 1);}for (let j = 0; j < grid[0].length; j++) {mark(grid, 0, j);mark(grid, grid.length - 1, j);}let ans = 0;for (let i = 0; i < grid.length; i++) {for (let j = 0; j < grid[0].length; j++) {if (grid[i][j] === 1) continue;if (dfs(grid, i, j)) ans++;}}return ans;
};
http://www.lryc.cn/news/227749.html

相关文章:

  • esp32-rust-std-examples-blinky
  • 【docker容器技术与K8s】
  • RT-DTER 引入用于低分辨率图像和小物体的新 CNN 模块 SPD-Conv
  • Folw + Room 实现自动观察数据库的刷新
  • 黑马程序员微服务Docker实用篇
  • 虚拟化服务器+华为防火墙+kiwi_syslog访问留痕
  • FlinkSQL聚合函数(Aggregate Function)详解
  • TensorFlow学习笔记--(3)张量的常用运算函数
  • RT-Thread:嵌入式实时操作系统的设计与应用
  • SpringBoot学习笔记-创建菜单与游戏页面(下)
  • STM32一
  • GPT-4 Turbo Assistants API
  • day08_回顾与课程概括
  • iptables、netfilter、firewalld、ufd简单介绍
  • Python基础入门例程53-NP53 前10个偶数(循环语句)
  • v-bind和v-model
  • Adobe premiere裁剪视频尺寸并转为GIF格式
  • 关于react输入框回显问题
  • 案例续集留言板
  • 72 内网安全-域横向CSMSF联动及应急响应初识
  • Leetcode—20.有效的括号【简单】
  • Leetcode—剑指OfferII LCR 019.验证回文串II【简单】
  • Mac电脑配置Flutter开发环境
  • QTableView如何清空数据保留表头
  • [工业自动化-17]:西门子S7-15xxx编程 - 软件编程 - PLC编程语言以及与嵌入式编程的比较
  • 云原生微服务架构及实现技术
  • Uniapp语言切换动态修改Js文件
  • GetSimple CMS忘记密码
  • 数据分析面试题1
  • 数据跨领域应用实例—车辆通行大数据应用场景(二)