zoukankan      html  css  js  c++  java
  • 695. Max Area of Island

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

    Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.)

    Example 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]]
    

    Given the above grid, return 6. Note the answer is not 11, because the island must be connected 4-directionally.

    Example 2:

    [[0,0,0,0,0,0,0,0]]

    Given the above grid, return 0.

    Note: The length of each dimension in the given grid does not exceed 50.

    dfs

    设置一个global variable area表示岛的面积。遍历数组元素,如果遇到1,把area重置为0,dfs遍历其上下左右求面积,再与max比较取较大值作为结果。

    dfs:终止条件是数组下标越界或者该点不为1。如果该点值为1,面积area增加1,把当前点赋值为0表示已访问过,然后遍历dirs数组对其上下左右的点进行同样的dfs操作。

    时间:O(M*N),空间:O(M*N) for worst case dfs recursion depth

    class Solution {
        int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};  //top, right, down, left
        int area;
        
        public int maxAreaOfIsland(int[][] grid) {
            if(grid == null || grid.length == 0) return 0;
            int max = 0;
            for(int i = 0; i < grid.length; i++) {
                for(int j = 0; j < grid[0].length; j++) {
                    if(grid[i][j] == 1) {
                        area = 0;
                        dfs(grid, i, j);
                        max = Math.max(max, area);
                    }
                }
            }
            return max;
        }
        
        private void dfs(int[][] grid, int x, int y) {
            if(x < 0 || x > grid.length - 1 || y < 0 || y > grid[0].length - 1 || grid[x][y] == 0) return;
            area += 1;
            grid[x][y] = 0;
            for(int[] dir : dirs) {
                int xpos = x + dir[0];
                int ypos = y + dir[1];
                dfs(grid, xpos, ypos);
            }
        }
    }
  • 相关阅读:
    Windows 7 X64平台编译LLVM+clang
    web前后端分离漏洞分析防御
    微信小程序中显示html富文本的方法
    微信小程序上拉加载下拉刷新
    微信小程序横向滚动
    微信小程序中的自定义组件 以及 相关的坑
    一款易用、高可定制的vue翻页组件 vo-pages
    vue调用高德地图:vue-amap
    Vue 前端md5加密
    js手机号码中间用星号代替。银行卡后四位之外改为星号
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10058471.html
Copyright © 2011-2022 走看看