小白学习[leetcode]之[搜索题]695. 岛屿的最大面积

题目的链接在这里:https://leetcode-cn.com/problems/max-area-of-island/


题目大意

给定一个包含了一些 0 和 1 的非空二维数组 grid 。

一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

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


一、示意图

在这里插入图片描述

二、解题思路

栈实现

代码如下:

class Solution {
int[] direction={-1,0,1,0,-1};
    //这里的五个数组 每两个相邻的就是一个对应的上下左右四个方向
    public int maxAreaOfIsland(int[][] grid) {
        //也就是统计相邻的1的个数最大值 就是标准的搜索题
        //这里使用深度遍历的方法 存在一个主函数和一个辅函数
        //主函数用于遍历所有的搜索位置,判断是否可以开始搜索,如果可以就在辅函数这边进行搜索,而辅函数就是负责深度优先搜索的递归调用
        //先试试看用栈来写
        int m=grid.length;
        int n=grid[0].length;
        int localArea=0;
        int area=0;
        int x,y;
        //开始进行遍历
        for(int i=0;i<m;++i){
            for(int j=0;j<n;++j){
                if(grid[i][j]==1){
                    //如果这个地方是对应的岛屿 也就是1的话
                    localArea=1;
                    //并把这个地方标记成0 为了防止又遍历回来
                    grid[i][j]=0;
                    //然后就是创建一个栈,这个栈里存入一个数组吧
                  Stack<int[][]> result=new Stack<>();
                  //然后把那个标记的位置存入 这个二维数组
                    int[][] T=new int[][]{{i}, {j}};
                    System.out.println("T = " + T[0][0]+"   "+T[1][0]);
                    result.push(new int[][]{{i}, {j}});
                    //再判断这个二维数组空不空
                    while(!result.isEmpty()){
                        //不空的话,取出栈顶元素
                        int[][]temp=result.peek();
                       // System.out.println("temp = " + temp);
                        //再删去栈顶元素
                        result.pop();
                        //再对栈顶元素进行 四个方向的判断 这个不确定
                       int left=temp[0][0];
                        System.out.println("left = " + left);
                        int right=temp[1][0];
                        System.out.println("right = " + right);
                        for(int k=0;k<4;k++){
                            x=left+direction[k];
                            y=right+direction[k+1];
                            //再进行非越界和为1的判断
                            if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1){
                                //没有越界并且面积为1
                                localArea++;
                                grid[x][y]=0;
                                //并将其放入到栈中
                               result.push(new int[][]{{x}, {y}});
                            }
                        }

                    }
                    //这里每一次local都要重新赋值一下 而area存储每一次的最大值 确保每一个都便利过一遍
                    area=Math.max(area,localArea);

                }
            }
        }
        return area;
    }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值