力扣刷题记录 -- JAVA---145--827. 最大人工岛


一、题目

在这里插入图片描述

在这里插入图片描述

二、代码

class Solution 
{
    //第一次遍历面积
    //第二次逐个尝试0变成1  查看面积
    int[][] position = {{-1,0},{1,0},{0,-1},{0,1}};
    public int dfs(int[][]grid, int row, int col ,int mark)
    {
        int ans = 0;
        grid[row][col] = mark;
        for(int[] current: position)
        {
            int curRow = row +current[0] , curCol = col +current[1];
            if(curRow < 0 || curRow >= grid.length || curCol <0 || curCol >= grid.length) continue;
            if(grid[curRow][curCol] == 1)
            {
                ans += 1+ dfs(grid, curRow ,curCol ,mark);
            }
        }

        return ans;
    }
    public int largestIsland(int[][] grid) 
    {
       int ans = Integer.MIN_VALUE, size = grid.length, mark = 2;
       Map<Integer,Integer> getSize = new HashMap<>();
       for(int row = 0; row <size; row++)
       {
           for(int col = 0; col<size; col++)
           {
               if(grid[row][col]==1)
               {
                  int areaSize = 1 + dfs(grid, row , col, mark);
                  getSize.put(mark++, areaSize);
               }

           }
       }

       for(int row = 0; row<size;row++)
       {
           for(int col =0 ; col<size; col++)
           {
               if(grid[row][col]!=0) continue;
               Set<Integer> hashSet = new HashSet<>();

               int curSize = 1;
               for(int[] current: position)
               {
                   int curRow = row + current[0],curCol = col + current[1];
                   if(curRow< 0  ||curRow >= grid.length ||curCol<0||curCol >= grid.length) continue;
                   int curMark = grid[curRow][curCol];
                   if(hashSet.contains(curMark) || !getSize.containsKey(curMark)) continue;
                   hashSet.add(curMark);
                   curSize += getSize.get(curMark);
               }
               ans = Math.max(ans,curSize);
           }
       } 


       return ans == Integer.MIN_VALUE ? size*size :ans;
    }
}

三、运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值