题目描述:

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

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

示例:

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

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

结果 => 0

题目难度:中等

心得体会:

这道题仔细分析一下能得出是实际是求一个无向图。因为限制了上下左右四个方向,当我们遍历到1的时候,我们便开始从四个方向去搜索。如果某个方向是1,则继续往上下左右去搜索。

比如,i = 0, j = 7的时候,值为1,我们需要遍历左右下,下方为0,于是将 i=1, j=7的值进行上下左右的遍历。我们使用递归的方式,通过改变节点的位置来遍历整个联通的线段。

大思路看起来没问题,使用一个深度优先遍历(DFS)就行。这里我思考几个问题。一是会不会死循环,比如上方进入下方,下方遍历又回到上方。第二个是已经遍历过的节点,在外部的二重循环到的时候,需不需要直接跳过。如果单次遍历的时候一个节点被不同的节点遍历,怎么计算?记录怎么保存?

一开始我使用从某个方向进入的节点不会返回改方向进行遍历。遍历过的数据用字符串保存在记录数组,然后每次查找一下是否在数组中。但是数据量大的时候会缺少某些节点,又很难调试。如果每次二重循环的时候重置记录数组,则会有许多重复遍历,超时。

后来参考了一下他人写的代码,改善了一下。

我们使用一个二维数组visited来保存该节点是否访问过。如果该节点为1,则visited[i][j] = 1。(依稀记得上数据结构课的时候学过,全还给老师了)

由于访问过的节点直接返回就可以了。我们不用担心递归无法结束的问题。最外层也不用重置。我们基于这样一个推测:如果一次遍历过的节点是另一次的遍历的开始,那么另一次的遍历结果就是那一次的结果,结点是联通的。

使用二维数组保存记录数组比数组["10","23"]这样的快很多,不用重置也大大提高了效率。

代码:

var maxAreaOfIsland = function(grid) {

var maxLength = 0;

var visited = [];

function hasSearched(pi, pj){

return visited[pi][pj] === 1

}

function findNeighbor(pi, pj) {

var islandLength = 0;

if(grid[pi][pj] === 1){

islandLength = 1;

//判断是否遍历过该节点 if(hasSearched(pi, pj)){

return 0;

}else{

visited[pi][pj] = 1;

}

//如果没有则继续遍历四个方向 if(pi > 0){

islandLength += findNeighbor(pi - 1, pj);

}

if(pi < grid.length - 1){

islandLength += findNeighbor(pi + 1, pj);

}

if(pj > 0){

islandLength += findNeighbor(pi, pj - 1);

}

if(pj < grid[pi].length -1){

islandLength += findNeighbor(pi, pj + 1);

}

}

return islandLength;

}

//初始化记录数组 for(var i = 0; i < grid.length; i++){

visited[i] = [];

for(var j = 0; j < grid[i].length; j++){

visited[i][j] = 0

}

}

for(var i = 0; i < grid.length; i++){

for(var j = 0; j < grid[i].length; j++){

//遍历每个节点 var islandLength = findNeighbor(i, j);

if(islandLength > maxLength){

maxLength = islandLength

}

}

}

return maxLength;

};

时间复杂度:好吧递归的我至今不会计算......希望大神能指点一二

题目链接:Loading...​leetcode-cn.com

岛屿最大面积 leetcode Java_LeetCode刷题记录——岛屿的最大面积相关推荐

  1. leetcode算法刷题记录之罗马数字转整数

    题目描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符          数值 I             1 V             5 X             ...

  2. LeetCode刷题记录15——21. Merge Two Sorted Lists(easy)

    LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) 目录 LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) ...

  3. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  4. LeetCode刷题记录13——705. Design HashSet(easy)

    LeetCode刷题记录13--705. Design HashSet(easy) 目录 LeetCode刷题记录13--705. Design HashSet(easy) 前言 题目 语言 思路 源 ...

  5. LeetCode刷题记录12——232. Implement Queue using Stacks(easy)

    LeetCode刷题记录12--232. Implement Queue using Stacks(easy) 目录 LeetCode刷题记录12--232. Implement Queue usin ...

  6. LeetCode刷题记录11——290. Word Pattern(easy)

    LeetCode刷题记录11--290. Word Pattern(easy) 目录 LeetCode刷题记录11--290. Word Pattern(easy) 题目 语言 思路 源码 后记 题目 ...

  7. LeetCode刷题记录10——434. Number of Segments in a String(easy)

    LeetCode刷题记录10--434. Number of Segments in a String(easy) 目录 LeetCode刷题记录9--434. Number of Segments ...

  8. LeetCode刷题记录9——58. Length of Last Word(easy)

    LeetCode刷题记录9--58. Length of Last Word(easy) 目录 LeetCode刷题记录9--58. Length of Last Word(easy) 题目 语言 思 ...

  9. LeetCode刷题记录8——605. Can Place Flowers(easy)

    LeetCode刷题记录8--605. Can Place Flowers(easy) 目录 LeetCode刷题记录8--605. Can Place Flowers(easy) 题目 语言 思路 ...

最新文章

  1. ECMAScript 2015(ES6)规范中的promise
  2. Python-OpenCV 处理图像(一):基本操作 cv2
  3. 织梦dedecms内核自适应移动POS机刷卡机招商加盟企业网站源码
  4. rhel5 下cacti安装日志
  5. android 9.0 c7Pro,低配版C9 Pro:国行三星Galaxy C7 Pro正式上线 你买吗?
  6. CAD看图软件的快速搜索功能怎么用?
  7. Use SageMath with PyCharm/PyDev (Use PyCharm/PyDev to run and debug SageMath scripts)
  8. 12 Best Custom ROMs for Android You Can Install
  9. 山东理工ACM 1115 C语言实验——交换两个整数的值(顺序结构)两种方法
  10. git 从远程服务器更新本地项目
  11. 基于Python,从零开始,裸写一套期权定价程序
  12. 个人精心整理的前端学习开发实用的网站
  13. hdu1540 Tunnel Warfare
  14. Python 利用opencv给白底照片换色,全网唯一
  15. python井字棋ai,python 井字棋(Tic Tac Toe)
  16. java入门考点_java入门基础知识点总结
  17. word自带的公式编辑器——用法技巧总结
  18. 基于react 的markdown编辑器
  19. openGL-梁友栋-Barsky算法
  20. 输入年份,然后打印出该年的万年历,以及标识出当天日期。类似于linux下的cal -y结果。

热门文章

  1. 如何使用JMX_Expoter+Prometheus+Grafana监控Hadoop集群
  2. 如何将图片的背景色去掉?怎样快速去除背景色?
  3. YOLO系列代码解读(图像检测)
  4. Conflux CTO伍鸣博士应邀出席金色沙龙
  5. M八七电影《新·奥特曼》主题曲歌手:米津玄師罗马音注释
  6. 没有学历,四步进Google
  7. xposed框架 微信群发源码
  8. 当您给别人身份证复印件时请你注意!
  9. 《一个程序员的奋斗史》读后感:从码农谈起
  10. 移动智能时代,为何还需要猎网平台?