图论05-岛屿的最大面积(Java)

这篇具有很好参考价值的文章主要介绍了图论05-岛屿的最大面积(Java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

5.岛屿的最大面积

  • 题目描述

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

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

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

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

示例 1:

图论05-岛屿的最大面积(Java),算法学习,图论,java,算法

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

示例 2:文章来源地址https://www.toymoban.com/news/detail-843310.html

输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
  • 题目分析
1.题目要求计算给定二进制矩阵 grid 中最大的岛屿面积,其中岛屿由相邻的1构成,相邻的1必须在水平或竖直方向上相邻。可以假设矩阵边缘被0包围。

2.思路分析
--遍历整个二维矩阵 grid,对每个位置进行如下操作:
--如果当前位置为1,则进行深度优先搜索(DFS)来计算当前岛屿的面积。
--DFS过程中,将访问过的位置标记为0,并累加岛屿的面积。
--维护一个变量 maxArea 来记录遍历过程中出现的最大岛屿面积,不断更新这个值。
--最终返回 maxArea 即为最大的岛屿面积。
   
3.代码分析
全局变量定义:

max:记录最大岛屿面积。
spare:记录当前岛屿的面积。
maxAreaOfIsland 方法:

遍历整个二维数组 grid,对每个位置进行如下操作:
如果当前位置为1,表示发现一个新的岛屿,调用 dfs 方法计算当前岛屿的面积。
更新 max 为当前最大值,并将 spare(当前岛屿面积)置零。
返回最大岛屿面积 max。
dfs 方法:

深度优先搜索方法,用于计算岛屿的面积。
判断当前位置是否越界,如果越界则返回。
如果当前位置为0,表示没有岛屿,直接返回。
若当前位置为1,增加当前岛屿面积 spare,并将当前位置标记为0,避免重复计算。
递归调用DFS,向上、下、左、右四个方向继续搜索岛屿。
复杂度分析:

时间复杂度:O(m*n),m 和 n 分别为矩阵的行数和列数,需要遍历整个矩阵。
空间复杂度:O(1),除了函数调用栈外,没有使用额外空间。
  • Java代码实现
class Solution {
    int max = 0;// 岛屿最大面积
    int spare = 0;// 当前岛屿的面积

    public int maxAreaOfIsland(int[][] grid) {
        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);// 获得一块岛屿的面积
                    max = Integer.max(max, spare);
                    spare = 0;
                }
            }
        }
        return max;
    }

    // 深度优先遍历的方法
    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;// 防止重复计算

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

到了这里,关于图论05-岛屿的最大面积(Java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

    127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord - s1 - s2 - … - sk: 每一对相邻的单词只差一个字母。 对于 1 = i = k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 给你两

    2024年04月09日
    浏览(58)
  • 图论算法|深度优先搜索理论基础|797.所有可能的路径|广度优先搜索BFS理论基础|200. 岛屿数量

    dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 递归和回溯是相辅相成的 https://leetcode.cn/problems/all-paths-from-source-to-target/ 有向无环图(DAG): 有环无向图是指在图中存在至少一个环(Cycle)的无向图。环是

    2024年02月15日
    浏览(28)
  • 【图论】Leetcode 200. 岛屿数量【中等】

    给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入:grid = [ [“1”,“1”,“1”,“

    2024年04月15日
    浏览(25)
  • 图论岛屿问题DFS+BFS

    leetcode 200 岛屿问题 BFS代码

    2024年02月09日
    浏览(17)
  • 第1关:学习-Java类和对象之static关键字之求圆环面积和周长

    本关任务:已知圆环的大圆半径 R 和 小圆半径 r 的长度分别为 32.0 和 10.0,求该圆环的面积和周长。 圆环面积公式为:S=π(R 2−r 2 ); 圆环周长公式为:C=2π(R+r)。 /** 任务:已知圆环的大圆半径 R 和 小圆半径 r 的长度分别为 32.0 和 10.0,求该圆环的面积和周长。 类名为:Ri

    2023年04月08日
    浏览(20)
  • Java手写最大流算法应用拓展案例

    最大流算法是图论中的经典算法,用于解决网络流问题。它的应用非常广泛,可以用于解决许多实际问题,如网络优化、流量分配等。本文将介绍最大流算法的三个拓展应用案例,并给出完整的代码实现。 在某个网络中,存在多个节点和连接这些节点的边。每条边都有一个容

    2024年02月07日
    浏览(33)
  • ✔ ★ 算法基础笔记(Acwing)(三)—— 搜索与图论(17道题)【java版本】

    1. 排列数字(3分钟) 每次遍历dfs参数是 遍历的坑位 原题链接 2. n-皇后问题 原题链接 方法 1. 按行遍历(过程中有回溯、剪枝) 思想: 每次递归中,遍历一行的元素,如果可以放皇后,就递归到下一行,下一行中不行了,就返回来,回溯, 方法2. 按每个元素遍历(没有减枝)

    2024年02月05日
    浏览(26)
  • 【Java基础学习打卡05】命令提示符

    知道命令提示符是什么,熟练打开命令提示符,熟练使用常用命令,并自行尝试其他命令。本文只是对命令提示符进行简单介绍和使用。 命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。在不同的操作系统环境下,命令提示符各不相同。在 Windows 环境下,命

    2024年02月09日
    浏览(25)
  • 数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)

    一、最短路径问题 从图中的某个顶点出发,到达另一个顶点的 所经过的边的权重之和最小 的一条路径。 1.1 两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,求一条最短铁路线。 1.1.1 Dijkstra算法 迪杰斯特拉(D

    2024年02月02日
    浏览(37)
  • 【力扣算法05】之 _1911_ 最大子序列交替和- python

    一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。 给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。 一个数组的 子序列

    2024年02月15日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包