​LeetCode解法汇总1254. 统计封闭岛屿的数目

news/2024/7/3 0:11:57

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。

请返回 封闭岛屿 的数目。

示例 1:

输入: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 区域包围)。

示例 2:

输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
输出:1

示例 3:

输入: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

提示:

  • 1 <= grid.length, grid[0].length <= 100
  • 0 <= grid[i][j] <=1

 

解题思路:

/**
 * 1254. 统计封闭岛屿的数目
 * 解题思路:
 * 标记状态,0代表没有遍历,1代表海域,2代表遍历中,3代表是不是独立岛屿,4代表是独立岛屿。
 * 然后遍历grid,如果grid[i][j]==0,则查找从这个点触发所有能达到的区域,并记录。返回值是是否是独立岛屿,
 * 如果是则把所有达到的点改为4,并且数量+1,否则改为3。
 * 然后继续查找下一个不为0的点。
 */

代码:

class Solution {
public:
    vector<vector<int>> directions = {
        {1, 0},
        {0, 1},
        {-1, 0},
        {0, -1},
    };
    const int STATE_NO_TRAVEL = 0;       // 没有遍历
    const int STATE_SEA = 1;             // 海域
    const int STATE_SEARCHING = 2;       // 遍历中
    const int STATE_NO_CLOSE_ISLAND = 3; // 确定不是独立岛屿
    const int STATE_CLOSE_ISLAND = 4;    // 确定是独立岛屿

    bool searchClosedIsland(vector<vector<int>> &grid, bool parentFlag, int x, int y, vector<vector<int>> &record)
    {
        if (y == 0 || y == grid.size() - 1 || x == 0 || x == grid[0].size() - 1)
        {
            record.push_back({y, x});
            return false;
        }
        record.push_back({y, x});
        bool flag = true;
        for (int i = 0; i < directions.size(); i++)
        {
            int newX = x + directions[i][1];
            int newY = y + directions[i][0];
            // 为3代表正在遍历中
            if (grid[newY][newX] == STATE_SEARCHING)
            {
                continue;
            }
            // 为1代表遇到海水
            if (grid[newY][newX] == STATE_SEA)
            {
                continue;
            }
            // 为2代表遇到未封闭的岛屿
            if (grid[newY][newX] == STATE_NO_CLOSE_ISLAND)
            {
                flag = false;
                continue;
            }
            // 为0代表未遍历过
            if (grid[newY][newX] != 0)
            {
                cout << "error" << endl;
            }
            grid[newY][newX] = STATE_SEARCHING;
            flag = flag & searchClosedIsland(grid, flag, newX, newY, record);
        }
        return flag & parentFlag;
    }

    int closedIsland(vector<vector<int>> &grid)
    {
        int sum = 0;
        vector<vector<int>> record;
        for (int y = 0; y < grid.size(); y++)
        {
            for (int x = 0; x < grid[0].size(); x++)
            {
                if (grid[y][x] != 0)
                {
                    continue;
                }
                bool flag = searchClosedIsland(grid, true, x, y, record);
                if (flag)
                {
                    sum++;
                }
                for (auto it : record)
                {
                    // cout << it[0] << " ";
                    grid[it[0]][it[1]] = flag ? STATE_CLOSE_ISLAND : STATE_NO_CLOSE_ISLAND;
                }
                record.clear();
            }
        }
        return sum;
    }
};

 


http://lihuaxi.xjx100.cn/news/1274230.html

相关文章

chatgpt赋能python:Python算和的重要性及优势

Python算和的重要性及优势 在现代科技时代&#xff0c;计算机的应用范围越来越广泛&#xff0c;Python算和作为一种高效而强大的计算工具&#xff0c;已经成为了无数科学家和工程师的必备技能。Python算和不仅仅在各类科学实验中有着重要的应用&#xff0c;也在企业开发、数据…

记录分享在10年老的商务本Dell E6230上安装Debian 12的过程,遇到的问题和解决方法

原先在笔记本上安装的是Debian 9&#xff0c;最近发现无法更新了&#xff0c;查一下发现&#xff0c;所有的“源”只支持deb10&#xff0c;11 和 12&#xff0c;所以特意订了一块新的硬盘来安装新系统&#xff0c;前后倒腾了两天多。 在此记录这个过程中遇到的问题和解决的方法…

嵌入式系统复习要点

目录 1、嵌入式系统的核心部分主要由硬件和软件两部分组成&#xff1a; 2、嵌入式系统硬件&#xff1a; 3、嵌入式处理器从体系上分类&#xff0c;可以分为冯诺依曼结构和哈佛结构两种&#xff1a; 4、几类常见的嵌入式处理器类型&#xff1a; 5、MCU组成结构&#xff1a;…

〖编程初学者的自我修养 - 满分面试篇①〗- 面试之前需要做的「长期准备工作」

简介&#xff1a;应 850 小伙伴要求&#xff0c; 无论你是迷茫的在校生还是已经就业的老司机&#xff0c;该专栏都值得你订阅&#xff0c;它会让你成就更好的自己&#xff01;说明&#xff1a;该文属于 编程初学者的自我修养 专栏&#xff0c;购买任意白宝书体系化专栏可加入易…

Android9.0 framework层InputDispatching造成的的ANR原理分析

1.前言 Android系统中,在app中进行一些操作时,系统中的ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会在app进行操作app时, 检测App的响应时间,如果App在特定时间无法响应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。 以下四个…

Ubuntu 如何启动、停止或重启服务

在本文中&#xff0c;我们向您介绍在 Ubuntu 中启动、停止和重启服务的方法。 列出 Ubuntu 中的所有服务 在开始之前&#xff0c;先获取计算机上所有服务的列表&#xff0c;因为我们需要知道服务名称来管理服务。 service --status-all 它将显示 Ubuntu 上的完整服务列表。…

读发布!设计与部署稳定的分布式系统(第2版)笔记11_无限长的结果集

1. 无限长的结果集是导致响应缓慢的常见原因 1.1. 当违反稳态模式时&#xff0c;就可能产生无限长的结果集 1.2. 当调用方允许另一个系统支配调用时&#xff0c;就会出现一个无限长的结果集 2. 数据库突然返回500万行&#xff0c;而不是通常的100多行时会发生什么&#xff1…