LeetCode 827题 最大人工岛

LeetCode 827题
也是递归
在这里插入图片描述

class Solution {
    boolean isChanged = false;
   int count = 0;
    int resNum = 0;
    Map<Integer, Integer> map = new HashMap<>();
    public int largestIsland(int[][] grid) {
        int flag = 2;
        int row = grid.length;
        int col = grid[0].length;
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(grid[i][j] == 1) {
                    count = 0;
                    dfs(grid, i, j, flag++);
                    if(resNum < count){
                        resNum = count;
                    }
                    map.put(flag-1, count);
                }
            }
        }

        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(grid[i][j] == 0) {
                    isChanged = true;
                    cal(grid, i, j);
                }
            }
        }
        if(!isChanged){
            return resNum; 
        }
        return resNum+1;
    }

    public void cal(int[][] grid, int row, int col){
        List<Integer> list = new ArrayList<>();
        int size = 0;
        if(row > 0 && grid[row-1][col] != 0 && !list.contains(grid[row-1][col])) {//向上
            size += map.get(grid[row-1][col]);
            list.add(grid[row-1][col]);
        }
        if(col > 0 && grid[row][col-1] != 0 && !list.contains(grid[row][col-1])) {//向左
            size += map.get(grid[row][col-1]);
            list.add(grid[row][col-1]);
        }
        if(col+1 < grid[0].length && grid[row][col+1] != 0 && !list.contains(grid[row][col+1])) {//向右
            size += map.get(grid[row][col+1]);
            list.add(grid[row][col+1]);
        }
        if(row+1 < grid.length && grid[row+1][col] != 0 && !list.contains(grid[row+1][col])) {//向下
            size += map.get(grid[row+1][col]);
            list.add(grid[row+1][col]);
        }
        if(resNum < size){
            resNum = size;
        }
    }

    public void dfs(int[][] grid, int row, int col, int flag) {
        grid[row][col] = flag;
        count++;
        if(row > 0 && grid[row-1][col] == 1) {//向上
            dfs(grid, row-1, col, flag);
        }
        if(col > 0 && grid[row][col-1] == 1) {//向左
            dfs(grid, row, col-1, flag);
        }
        if(col+1 < grid[0].length && grid[row][col+1] == 1) {//向右
            dfs(grid, row, col+1, flag);
        }
        if(row+1 < grid.length && grid[row+1][col] == 1) {//向下
            dfs(grid, row+1, col, flag);
        }
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值