热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Leetcode200查找岛屿数量详解

Leetcode20

 往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

Leetcode21-合并两个有序链表详解

Leetcode22-有效括号生成详解

Leetcode24-两两交换链表中的节点详解

Leetcode27-移除元素详解

Leetcode46-全排列详解

Leetcode49-字母异位分组详解

Leetcode53-最大子数组和详解

Leetcode56-合并区间详解

LeetCode57-插入区间详解

Leetcode77-组合详解

Leetcode78-子集详解

Leetcode90-子集II详解

Leetcode94-二叉树的中序遍历详解

Leetcode102-二叉树的层序遍历详解

Leetcode107-二叉树的层序遍历II详解

Leetcode169-多数元素详解


目录

题目

示例

解析

DFS

BFS

代码

DFS

BFS


题目

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

分析:

1. 数字1的部分为大陆,数字0的部分为岛屿

2. 大陆只能与上下左右的1组成,斜对角方向的1不能组成


示例

示例1

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例2

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3


解析

DFS

对于示例2,首先根据规则可以看到,总共有三个岛屿

使用DFS方法的思想进行分析,首先第一步可以设置一个指针,指针初始指向(0,0)的位置,由于只能上下左右的1能构成岛屿,所以第二步将(0,0)位置上下左右的1变成0,证明这些1已经与(0,0)位置构成了岛屿,然后第三步再将指针指向(0,1)位置移动,第四步同样将上下左右的1变成0,然后再移动,直到当前位置的上下左右全部为0没有1时,说明当前岛屿已经结束,再继续移动找下一个岛屿,直到到达整个二维数组的最后。

根据示例2详细分析

 当指针继续移动到(0,2)的位置时,此位置的上下左右全部为0,说明没有符合的1能继续组成岛屿,所以此时岛屿1已经全部找到。

继续移动指针,去找下一个岛屿......

当指针移动到(2,2)的位置时,出现了1,说明又有新的岛屿出现了,同样进行1变0的操作,但是此时上下左右都是0,说明岛屿已经全部找到,这是一个“小岛屿”

同样继续移动指针,去找下一个岛屿......

当指针移动到(3,3)的位置时又出现了1,说明有新的岛屿出现,将上下左右的1变为0

当指针移动到最后时,所有区域都已经遍历完了

BFS

BFS方法的过程也是找上下左右的1的过程,不过这里要用到队列,大致过程为第一步将指针指向(0,0)的位置,第二步将该位置的坐标放入队列中,第三步从队列中取出坐标位置,第四步将坐标上下左右为1的位置放入队列中

 第五步将上下左右为1的位置变为0,第六步取出队列第一个元素,并将其上下左右为1的位置放入队列,第七步将为1的位置变成0

 依次取出队列中的坐标,并判断上下左右是否有1,直到队列中没有坐标

移动指针,直到移动到下一个为1 的位置,则找到第二个岛屿

 移动指针,找到第三个岛屿


代码

DFS

class Solution: def numIslands(self, grid: List[List[str]]) -> int: if grid is None or len(grid) == 0: # 如果整个区域为空,则无岛屿,直接返回0 return 0 result = 0 # 记录岛屿数量 row = len(grid) # 整个区域的行数 col = len(grid[0]) # 整个区域的列数 # 用2个for循环遍历整个区域 for i in range(0, row): for j in range(0, col): if grid[i][j] == '1': # 找到了新岛屿 result += 1 self.dfs(grid, i, j, row, col) return result def dfs(self, grid, x, y, row, col): # (x,y)为当前指针所指位置 # x,y在区域外时直接停止循环 if x<0 or y<0 or x>=row or y>= col or grid[x][y]=='0': return grid[x][y] = '0' #将1变0 # 找上下左右为1的位置变0 self.dfs(grid, x-1, y, row, col) # 左边变0 self.dfs(grid, x+1, y, row, col) # 右边变0 self.dfs(grid, x, y-1, row, col) # 上边变0 self.dfs(grid, x, y+1, row, col) # 下边变0

BFS

class Solution: def numIslands(self, grid: List[List[str]]) -> int: if grid is None or len(grid) == 0: # 如果整个区域为空,则无岛屿,直接返回0 return 0 result = 0 # 记录岛屿数量 row = len(grid) # 整个区域的行数 col = len(grid[0]) # 整个区域的列数 queue = [] for i in range(0, row): for j in range(0, col): if grid[i][j] == '1': result += 1 queue.append([i,j]) grid[i][j] = '0' while len(queue) > 0: cur = queue.pop() x = cur[0] y = cur[1] if x-1 >= 0 and grid[x-1][y] == '1': queue.append([x-1,y]) grid[x-1][y] = '0' if y-1 >= 0 and grid[x][y-1] == '1': queue.append([x,y-1]) grid[x][y-1] = '0' if x+1

推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
author-avatar
G眯眼猫2850927647Ona
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有