695:岛屿的最大面积

问题描述

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

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)

示例

[[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’。

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

对于上面这个给定的矩阵, 返回 0。
注意: 给定的矩阵grid 的长度和宽度都不超过 50。

思路

没啥好想的。这不类似是严版数据结构的迷宫问题嘛。而且比迷宫问题还要简单。
用DFS和BFS都能做。
还学到了沉岛思想,不过并没有啥卵用。因为不能破坏题目数据。
为了AC拼了。
记得要有一个办法标记已经判定过的数据(剪枝)
BFS(方法一)
DFS(方法二)

方法一

Java版

class Solution {
    public int maxAreaOfIsland1(int[][] grid) {
        if(grid.length == 0){
            return 0;
        }
        int height = grid.length;
        int width = grid[0].length;
        boolean[][] isVisited = new boolean[height][width];
        int max = 0;
        for(int i = 0; i < height; i++){
            for(int j = 0; j < width; j++){
                if(grid[i][j] == 1 && !isVisited[i][j]){
                    int tmp = maxArea(grid,isVisited,i,j);
                    max = Math.max(tmp,max);
                }
            }
        }
        return max;
    }
    private int maxArea(int[][] grid,boolean[][] isVisited, int x,int y){
        Queue<Node> queue = new LinkedList<>();
        queue.add(new Node(x,y,grid[x][y]));
        isVisited[x][y] = true;
        int res = 1;
        while(!queue.isEmpty()){
            Node tmp = queue.poll();
            if(0 < tmp.x && !isVisited[tmp.x-1][tmp.y] && grid[tmp.x-1][tmp.y] == 1){
                isVisited[tmp.x-1][tmp.y] = true;
                queue.add(new Node(tmp.x-1,tmp.y,grid[tmp.x-1][tmp.y]));
                res++;
            }
            if(tmp.x < grid.length-1 && !isVisited[tmp.x+1][tmp.y] && grid[tmp.x+1][tmp.y] == 1){
                isVisited[tmp.x+1][tmp.y] = true;
                queue.add(new Node(tmp.x+1,tmp.y,grid[tmp.x+1][tmp.y]));
                res++;
            }
            if(0 < tmp.y && !isVisited[tmp.x][tmp.y-1] && grid[tmp.x][tmp.y-1] == 1){
                isVisited[tmp.x][tmp.y-1] = true;
                queue.add(new Node(tmp.x,tmp.y-1,grid[tmp.x][tmp.y-1]));
                res++;
            }
            if(tmp.y < grid[0].length-1 && !isVisited[tmp.x][tmp.y+1] && grid[tmp.x][tmp.y+1] == 1){
                isVisited[tmp.x][tmp.y+1] = true;
                queue.add(new Node(tmp.x,tmp.y+1,grid[tmp.x][tmp.y+1]));
                res++;
            }
        }
        return res;
    }
}
class Node{
    public int x;
    public int y;
    public int val;
    Node(int x, int y, int val){
        this.x = x;
        this.y = y;
        this.val = val;
    }
}

方法二

Java版

public int maxAreaOfIsland(int[][] grid){
        if(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++){
                max = Math.max(max,DFS(grid,i,j));
            }
        }
        return max;
    }
    private int DFS(int[][] grid, int x, int y){
        if(grid[x][y] == 0) return 0;
        int res = 1;
        grid[x][y] = 0;
        if(0<x) res += DFS(grid,x-1,y);
        if(x<grid.length-1) res += DFS(grid,x+1,y);
        if(0<y) res += DFS(grid,x,y-1);
        if(y<grid[0].length-1) res+= DFS(grid,x,y+1);
        return res;
    }
发布了396 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/104875114
今日推荐