(深度优先搜索)LeetCode695.岛屿的最大面积

目录

题目:

​​解析:

dfs函数:

完整代码:


题目:

LeetCode695. 岛屿的最大面积(题目链接)

 

解析:

        本题要求找出x轴和y轴方向上连续的1的数量,并比较最大值。解本道题有两种常用的方法,深度优先搜索DFS广度优先搜索BFS在这篇文章中,我们使用深度优先搜索来解决此题。

首先遍历整个m*n的矩阵,由题目可知此矩阵为二进制矩阵,所以矩阵中的数字只有“0”和“1”两种情况。在遍历整个矩阵的同时,我们对每个矩阵元素进行深度优先搜索,搜索方向为上,下,左,右四个方向,如果在这四个方向中有任何一个方向存在“1”,那么我们就递归dsf函数,调用的参数为新的值为“1”的元素所在的坐标。这时候我们会发现一个新的问题出现了,当我们从Pre1元素走向下一个值为“1”Post1元素后,若不做任何处理,dfs函数很可能发生回退的情况,并且在Pre1和Post1两个元素间无限循环计数,所以我们每走过一个值为“1”的元素后,将走过的元素从“1”置为“0”,防止死循环的发生。

dfs函数:

//当前坐标的dsf函数
public int Dfs(int[][] grid, int pre_i, int pre_j){
        //判断条件1.如果在朝上下左右四个方向中的任意一个位置移动后,溢出数组,则停止dfs.
        //判断条件2.如果此时处于的坐标的值不等于1,则返回值0.
        if(pre_i < 0 || pre_i == grid.length || pre_j < 0 
        || pre_j == grid[0].length || grid[pre_i][pre_j] == 0){
            return 0;
        }
        //走过的坐标的值置为0.
        grid[pre_i][pre_j] = 0;
        //ans为计数器,当前运行到此步骤时,已有一个值为“1”的元素被记录了,所以ans值为1.
        int ans = 1;
        //向四个方向移动的增量数组,iChange表示i坐标(y轴方向上)的增量,jChange同理.
        int[] iChange = new int[]{-1, 0, 1, 0};
        int[] jChange = new int[]{0, 1, 0, -1};
        //向四个方向去探索并递归dfs函数.
        for(int i = 0; i < 4; i++){
            int new_i = pre_i + iChange[i];
            int new_j = pre_j + jChange[i];
            //新坐标的dfs函数.
            ans += Dfs(grid, new_i, new_j);
        }
        //最终返回ans的值.
        return ans;
    }

完整代码:

class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        int ans = 0;
        //嵌套循环遍历整个矩阵
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
                //使用Math.max方法不断更新并获取最大值.
                ans = Math.max(ans, Dfs(grid, i, j));
            }
        }
        return ans;
    }
    public int Dfs(int[][] grid, int pre_i, int pre_j){
        if(pre_i < 0 || pre_i == grid.length || pre_j < 0 
        || pre_j == grid[0].length || grid[pre_i][pre_j] == 0){
            return 0;
        }
        grid[pre_i][pre_j] = 0;
        int ans = 1;
        int[] iChange = new int[]{-1, 0, 1, 0};
        int[] jChange = new int[]{0, 1, 0, -1};
        for(int i = 0; i < 4; i++){
            int new_i = pre_i + iChange[i];
            int new_j = pre_j + jChange[i];
            ans += Dfs(grid, new_i, new_j);
        }
        return ans;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值