给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

示例 1:
[[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:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。

注意:给定的矩阵grid的长度和宽度都不超过 50。

package com.loo;

import java.util.LinkedList;
import java.util.Queue;

public class MaxIslandArea {
    
    public static int[] DX = new int[] {1 , 0 , -1 , 0};
    public static int[] DY = new int[] {0 , 1 , 0 , -1};

public static void main(String[] args) {
        int[][] grid1 = {
                {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}
        };
        int[][] grid2 = new int[][] {{0,0,0,0,0,0,0,0}};
        System.out.println(getMaxIslandArea1(grid1));
        System.out.println(getMaxIslandArea2(grid2));
    }
    
    // 深度优先。一个土地上,以 4 个方向探索与之相连的每一个土地(以及与这些土地相连的土地),那么探索过的土地总数将是该连通形状的面积。
    // 为了确保每个土地访问不超过一次,每次经过一块土地时,将这块土地的值置为 0。这样就不会多次访问同一土地。
    public static int getMaxIslandArea1(int[][] grid) {
        if (grid == null || grid.length==0 || grid[0].length==0) {
            return 0;
        }
        int m = grid.length;
        int n = grid[0].length;
        int maxArea = 0;
        for (int i=0;i<m;i++) {
            for (int j=0;j<n;j++) {
                if (grid[i][j]==1) {
                    maxArea = Math.max(maxArea, dfs(grid , i , j));
                }
            }
        }
        return maxArea;
    }
    
    public static int dfs(int[][] grid , int x , int y) {
        if (x<0 || x>=grid.length || y<0 || y>=grid[0].length || grid[x][y]==0) {
            return 0;
        }
        grid[x][y] = 0;
        int result = 1;
        for (int k=0;k<4;k++) {
            int dx = x + DX[k];
            int dy = y + DY[k];
            result += dfs(grid , dx , dy);
        }
        return result;
    }
    
    // 广度优先
    public static int getMaxIslandArea2(int[][] grid) {
        if (grid == null || grid.length==0 || grid[0].length==0) {
            return 0;
        }
        int m = grid.length;
        int n = grid[0].length;
        int maxArea = 0;
        for (int i=0;i<m;i++) {
            for (int j=0;j<n;j++) {
                int area = 0;
                if (grid[i][j]==1) {
                    area++;
                    grid[i][j] = 0;
                    Queue<Integer> queue = new LinkedList<Integer>();
                    queue.add(i*n+j);
                    while (!queue.isEmpty()) {
                        int value = queue.poll();
                        int x = value/n;
                        int y = value%n;
                        for (int k=0;k<4;k++) {
                            int dx = x + DX[k];
                            int dy = y + DY[k];
                            if (dx<0 || dx>=grid.length || dy<0 || dy>=grid[0].length || grid[dx][dy]==0) {
                                continue;
                            }
                            if (grid[dx][dy]==1) {
                                queue.add(dx*n+dy);
                                area++;
                                grid[dx][dy] = 0;
                            }
                        }
                    }
                }
                maxArea = Math.max(maxArea, area);
            }
        }
        return maxArea;
    }

}

岛屿的最大面积(Java)相关推荐

  1. 求岛屿的最大面积java

    求岛屿的最大面积 给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻.你可 ...

  2. LeetCode 695. 岛屿的最大面积【c++/java详细题解】

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相 ...

  3. 力扣(Leetcode)695. 岛屿的最大面积(Java)带注释

    leetcode刷题695. 岛屿的最大面积 1.题目描述 2.解法 1.DFS(深度优先搜索) 2.DFS + 栈 1.题目描述 给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一 ...

  4. java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...

    导航:网站首页 > C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计 C++编程:定义一个圆类要求属性为半径, ...

  5. 岛屿类-网格类问题-DFS | 力扣695. 岛屿的最大面积

    思路参考上文: 岛屿类-网格类问题-DFS | 力扣200. 岛屿数量 本文讲解695. 岛屿的最大面积问题,属于常见的岛屿类-网格类问题 本题使用DFS的思想 题目 给定一个包含了一些 0 和 1 ...

  6. 二维矩阵中的最大矩形面积--java实现

    一.原题: 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积. 样例: 给你一个矩阵如下: [[1, 1, 0, 0, 1],[0, 1, 0 ...

  7. 岛屿最大面积 leetcode Java_LeetCode:岛屿的最大面积

    岛屿的最大面积 题目叙述: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包 ...

  8. 695. 岛屿的最大面积

    岛屿的最大面积 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到 ...

  9. 算法编程10:岛屿的最大面积

    描述 给定一个包含了一些 0 和1的非空二维数组grid,一个岛屿是由四个方向 (水平或垂直) 的1(代表土地) 构成的组合. 你可以假设二维矩阵的四个边缘都被水包围着.找到给定的二维数组中最大的岛屿 ...

最新文章

  1. 源码 linux下编译_Linux云服务器软硬链接及源码编译安装python3.8的一些备注
  2. 「Python」Command “python setup.py egg_info“ failed with error code 1 in /tmp/pip-build-Yt_rRN/grpcio
  3. 小学二年几手工计算机的制作,小学二年级创意手工制作方法
  4. 一文读懂层次聚类(Python代码)
  5. 【Beam Search】seq2seq中的beam search算法过程
  6. WINX的消息分派机制(续)
  7. js书写原生ajax,JS 原生ajax写法
  8. Win10 LTSC版如何安装应用商店Microsoft Store
  9. 大疆aeb连拍_一张图带你轻松读懂摄影必备专业术语~
  10. 怎么在b站引流?b站怎么吸粉?b站引流技巧和方法
  11. 2020年创业风口:社交电商
  12. vue使用FullCalendar插件实现会议预约功能,个性化实现周视图
  13. veket linux输入法,智能通用输入法平台(SCIM for veket)
  14. 读论文《Natural Language Processing (Almost) from Scratch》
  15. Esri总裁用96页PPT告诉你GIS的未来将如何发展,而我们又该为此如何准备
  16. 让ChatGPT干正事,如何查找靠谱的真文献写论文
  17. service引入其他dao报错_绝了!这款工具让SpringBoot不再需要Controller、DAO、Mapper!...
  18. vue--mixin混入以及虚拟DOM和diff算法
  19. 地球坐标 火星坐标 百度坐标 相互转换
  20. 深度学习基础论文学习

热门文章

  1. GreatSQL配置到系统systemd服务
  2. 分享《Essential Linux Device Drivers》中文版高清电子版
  3. 桌面cpu与服务器cpu天梯,台式CPU性能怎么看?桌面CPU天梯图2018年1月更新版
  4. UNI-APP安卓本地打包详细教程(保姆级)
  5. php正则表达式表情,php正则表达式储存展示表情字符的方法
  6. 阿里云镜像恢复,镜像取证
  7. java 雷达反射面积_请问:如何使用基本反射率雷达图中的dBZ值判断天气情况?比如多云、雷雨、晴等。谢谢!...
  8. 设计并编写代码自动格斗类游戏
  9. 辅材先生之打开传统向互联网+辅材这把锁
  10. 南邮 OJ 1128 An Industrial Spy