<LeetCode>695. 岛屿的最大面积

原创 2018年04月16日 22:44:08

本题主要复习的是图的DFS。

首先如何用递归去完成DFS呢?思路是这样的,首先找到目标点,然后从目标点发散开来。

怎么发散?那就要有一个方向。没错,那我们需要实现方向,怎么实现?数组增减1咯,在后面的样例中我们用一个数组来表示方向。

然后当我们到达新的方向之后怎么办?继续DFS,没错。怎么实现?那就是递归咯。

等等,每次到达新的地方都要DFS么?当然不是,如果那个值是你要找的,那你就继续扩散,如果不是你要找的,那就不扩散啊。怎么实现?加一条if语句咯。

再等等,你是不是没有考虑数组越界?没错,那我们还需要一些判断语句,保证我们的数组是不越界的。

好的,dfs的所有思路讲解完毕。


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

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

示例 1:

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

示例 2:

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

对于上面这个给定的矩阵, 返回 0

注意: 给定的矩阵grid 的长度和宽度都不超过 50。


class Solution {
public:

    int dfs(vector<vector<int>>& grid, int x0, int y0){
        int n, m, sum=1;
        n = grid.size();
        m = grid[0].size();

        grid[x0][y0] = 0; //当前元素设置为0,避免再次搜索到
        int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};

        for(int i=0; i<4; i++){
            int x = x0 + dir[i][0];
            int y = y0 + dir[i][1];
            if(x>=0&&x<n&&y>=0&&y<m&&grid[x][y]==1)
                sum+=dfs(grid, x, y);
        }
        return sum;

    }
    int maxAreaOfIsland(vector<vector<int>>& grid) 
    {
        int mx = 0, n, m;
        n = grid.size();
        m = grid[0].size();
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {
                if(grid[i][j] == 1)   
                    mx = max(dfs(grid,i,j), mx);
            }
        return mx;
    }
};


Composer 是 PHP 的一个依赖管理工具

-
  • 1970年01月01日 08:00

[LeetCode463]Island Perimeter岛屿周长问题

You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen...
  • fjnu_se
  • fjnu_se
  • 2017-06-03 09:24:59
  • 407

【LeetCode-面试算法经典-Java实现】【200-Number of Islands(岛的数目)】

【200-Number of Islands(岛的数目)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-Chao...
  • DERRANTCM
  • DERRANTCM
  • 2015-08-25 06:46:02
  • 4257

<LeetCode>695. 岛屿的最大面积

本题主要复习的是图的DFS。 首先如何用递归去完成DFS呢?思路是这样的,首先找到目标点,然后从目标点发散开来。 怎么发散?那就要有一个方向。没错,那我们需要实现方向,怎么实现?数组增减1咯,在后...
  • w8253497062015
  • w8253497062015
  • 2018-04-16 22:44:08
  • 25

【刷题算法】寻找岛的个数

昨晚听左神讲了一个很有意思的题。题目意思大概是:给定一个二维数组,所有位置的值不是0就是1。规定每个位置可以和它上下左右位置上的值相连。有一个叫做岛的概念,定义如下: 连成一片的1,如果周围都是0,...
  • shwan_ma
  • shwan_ma
  • 2017-08-03 12:41:22
  • 351

给出01数组计算出符合岛屿规则的个数 [牛客网-滴滴出行2017春招算法工程师笔试题B卷 ]

c语言算法题-给出01数组计算出符合岛屿规则的个数 [牛客网-滴滴出行2017春招算法工程师笔试题B卷 ] 题目和这个网站描述的意思一致:http://www.th7.cn/Program/cp/20...
  • rock4you
  • rock4you
  • 2017-05-07 21:12:14
  • 984

第五章 递归综合习题(leetcode)

下面例举了一些leetcode上面的一些习题,作为前一篇内容的补充。没有涉及到动态规划、分治法的题目,因为那些题目难度都比较大^^。 这些题目主要讲解如何根据书上的三种类型,设计递归算法。对于递归定...
  • jsxyg63
  • jsxyg63
  • 2017-10-23 22:43:38
  • 54

C/C++面试题分享

1、指针和引用的区别? 答:引用是在C++中引入的。它们之间的区别有: (1)       非空区别:指针可以为空,而引用不能为空 (2)       可修改区别:如果指针不是常指针...
  • tao_627
  • tao_627
  • 2013-11-24 13:44:22
  • 1138

关于C语言中二维数组的P+1与*(P+1)个人浅见

本人第一次在CSDN上发表博客,也是第一次用Markdown来编辑文章,可能会有一些错误,希望各位大神多多指点!好了,闲言少续,我们进入主题: 在C语言中,有很多数据类型(Int、Float、Cha...
  • u012780337
  • u012780337
  • 2015-08-24 14:36:03
  • 1630

解决动态数组的方法二:vector类

前一篇文章讨论了使用指针避免在函数中需要指定数组大小的事请,但还是有点麻烦,这里提供了一个更好的方案:使用vector类。vector类有个好处,可以作为对象而不是数组传入函数中,这样避免了数组在参数...
  • ytzlln
  • ytzlln
  • 2017-10-12 22:38:05
  • 106
收藏助手
不良信息举报
您举报文章:<LeetCode>695. 岛屿的最大面积
举报原因:
原因补充:

(最多只允许输入30个字)