首页 > 编程语言 >图论06-飞地的数量(Java)

图论06-飞地的数量(Java)

时间:2024-03-21 21:59:59浏览次数:25  
标签:陆地 06 飞地 单元格 dfs int flag grid Java

6.飞地的数量

  • 题目描述

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

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

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

示例 1:

img

输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
  • 题目分析
1.题目分析
给定一个二进制矩阵 grid,其中0表示海洋单元格,1表示陆地单元格。
一次移动是指从一个陆地单元格走到另一个相邻的陆地单元格或者跨过矩阵边界。
要求找出在任意次数的移动中无法离开网格边界的陆地单元格数量。

2.思路分析
--主要思路:
使用深度优先搜索(DFS)来遍历所有的陆地单元格,并标记与边界相连的陆地单元格。
维护两个全局变量 flag 和 spare,分别用于标记每块岛屿是否靠海和记录每块岛屿的面积。
遍历整个二维网格,对每个陆地单元格进行DFS处理,统计无法跨越边界的方块数。

--详细步骤:
-初始化 count 为0,用于表示无法跨越边界的方块数。
-遍历二维网格 grid 的每个单元格 (i, j):
-如果当前单元格为陆地(grid[i][j] == 1),则调用 dfs 方法进行DFS处理。
-在 dfs 方法中:
如果当前位置 (i, j) 超出边界或者是海洋(grid[i][j] == 0),则返回。否则,标记当前位置为已访问,更新 spare 记录当前岛屿面积。
如果当前位置在边界上,则将 flag 标记为1,表示当前岛屿靠近海洋。继续递归调用DFS处理当前位置的四个相邻位置。
如果当前岛屿不靠近海洋(flag == 0),则将当前岛屿的面积累加到 count 中。最后返回 count 作为结果。
-复杂度分析:
时间复杂度:O(m*n),m 和 n 分别为二维网格的行数和列数,需要遍历整个二维网格。
空间复杂度:O(1),除了函数调用栈外,没有使用额外空间。
  • Java代码实现
class Solution {
    int flag = 0; // 用于标记每块岛屿是否靠海
    int spare = 0; // 用于标记每块岛屿的面积

    public int numEnclaves(int[][] grid) {
        int count = 0; // 表示无法跨越边界的方块数
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    dfs(grid, i, j);
                    if (flag == 0) {
                        count += spare;
                    }
                    spare = 0;
                    flag = 0;
                }
            }
        }
        return count;
    }

    private void dfs(int[][] grid, int i, int j) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) {
            return;
        }

        if (grid[i][j] == 0) {
            return;
        }

        spare++;
        grid[i][j] = 0;
        if (i == 0 || i == grid.length - 1 || j == 0 || j == grid[0].length - 1) {
            flag = 1; // 表示存在临海区域
        }

        dfs(grid, i + 1, j); // 下
        dfs(grid, i - 1, j); // 上
        dfs(grid, i, j + 1); // 右
        dfs(grid, i, j - 1); // 左
    }
}

标签:陆地,06,飞地,单元格,dfs,int,flag,grid,Java
From: https://blog.csdn.net/XYX_888/article/details/136898725

相关文章

  • java流程控制语句
    今天是复习学习第四天如果有和我一样复习Java基础或者准备学习Java的可以看看我的这些学习内容也欢迎大佬观看我的文章做出指导对我代码或者觉得我哪里理解不到位希望能给我指导指导非常感谢大家祝大家在计算机行业越来越好!!!下面是我今天复习的内容Java流程控制语句分......
  • 《Java核心技术·卷 II(原书第11版)》PDF
    本书针对Java11进行了修订,涵盖了完整的对高级UI特性、企业编程、网络、安全和Java强大的模块系统等内容的讨论。书中对Java复杂的新特性进行了深入而全面的研究,展示了如何使用它们来构建具有专业品质的应用程序,作者所设计的经过全面完整测试的示例反映了当今的Java风格和*佳实践......
  • 23种设计模式核心思想及代码实现(Java C++)
    目录代码OOP七大原则策略模式单例模式观察者模式装饰模式抽象工厂模式工厂模式简单工厂模式工厂模式抽象工厂模式三种工厂模式的区别简单工厂模式和策略模式的不同pipeline模式职责链模式代理模式静态代理动态代理......
  • 记一些java里的数据结构
    0.Vector:过期的,被arraylist取代了0.1Stack:也不建议使用1.双向链表LinkedList:由list实现的接口类2.队列Queue:操作为addremoveelement(会报异常)offerpollpeek3.双端队列Deque:就是栈+队列Deque<>deque=newLinkedList()<>;常用操作:(会返回特殊值不会报异常)......
  • SpringbootLogingApplication has been compiled by a more recent version of the Ja
    一、问题描述:        SpringbootLogingApplicationhasbeencompiledbyamorerecentversionoftheJavaRuntime(classfileversion61.0),thisversionoftheJavaRuntimeonlyrecognizesclassfileversionsupto55.0        更新版本的Ja......
  • java基础重新巩固
    publicclassDemo01{publicstaticvoidmain(String[]args){//整数:进制二进制0b十进制八进制0十六进制0xinti=0;inti2=010;//八进制8inti3=0x10;//十六进制16System.out.println(i......
  • Java使用注解@Scheduled开启定时任务
    @Scheduled(cron="[秒][分][小时][日][月][周][年]")说明:多个并列的时间以英文逗号“,”隔开。比如:@Scheduled(cron="053,55161**")上面意思是:1号的下午16:53,16:55执行二次。 @Scheduled(cron="0/10****?")每隔10秒运行一次。 @Scheduled(c......
  • Java list初始化的几种办法
    在Java中初始化List的五种方法1.构造List后使用List.add初始化2.使用{{}}双括号语法3.使用Arrays.asList4.使用Stream(JDK8)5.使用Lists(JDK9)在Java中初始化List的五种方法Java中经常需要使用到List,下面简单介绍几种常见的初始化方式。1.构造......
  • JavaScript初识及基本语法详解
    JavaScript是一种轻量级的解释型或即时编译型的编程语言。它最初被设计为在浏览器中用于与网页进行交互,但随着时间的推移,它已经成为了后端开发、游戏开发、桌面应用开发等多个领域的重要工具。1.JavaScript初识1.1历史与用途历史:由BrendanEich在1995年开发,最初......
  • java毕业设计线上牙科诊所管理推荐系统的设计与实现(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的飞速发展,越来越多的传统行业开始向数字化转型。医疗行业作为人们生活中的重要组成部分,其信息化、智能化的需求日益增长。牙科诊所作为提......