leetcode 岛屿的个数 python
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000 输出: 1
示例 2:
输入:
11000
11000
00100
00011 输出: 3

我的思想:
输入是一个二维数组,"0" 代表是水 "1"代表是陆地 (注意里面存的是字符串,很坑 我调了半天才发现)
从左上角(0, 0)开始 遍历所有位置 一直到右下角 (m, n), 这个过程中
如果发现当前位置是"1", 先把这个位置标记为查询过,
然后递归查看当前位置的上下左右四个位置,把是"1"的标记遍历过,再查看这个位置的上下左右
实际上是一个循环 套了一个递归来实现。
当发现一个陆地 就计数器自增1 然后和这个陆地相连的所有陆地都标记为已经查找过 小技巧:
遍历图的时候,边界位置要留意,左边没有左侧,上边没有上侧,右边没有右侧,下边没有下侧,
可以写分支判断如果是边界就不遍历外侧。
我选择的办法是,在图的外侧增加一圈"0", 相当于扩大了整个图,
这样在递归陆地的过程中会节省了判断,并且不用考虑超出范围的问题。 python代码:
class Solution:
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
# 如果是空图 返回没有陆地
if not grid:
return 0
# 把原图改变一下 四周加上一圈"0" 防止出界 方便遍历
w, h = len(grid[0]), len(grid)
new_grid = [["" for i in range(w + 2)]]
for g in grid:
new_grid.append([""] + g + [""])
new_grid.append(["" for i in range(w + 2)]) num = 0 # 记录陆地数量 # 遍历除了周围的"0" 中间的部分
for i in range(1, h+1):
for j in range(1, w+1):
if new_grid[i][j] == "": # 如果是陆地 就进入深度遍历
num += 1
self.deep_search(i, j, new_grid) return num def deep_search(self, i, j, grid):
"""如果当前是陆地,把当前结点标记遍历过,并分别看左右上下四个位置"""
if grid[i][j] == "":
return
grid[i][j] = ""
self.deep_search(i-1,j,grid)
self.deep_search(i,j-1,grid)
self.deep_search(i,j+1,grid)
self.deep_search(i+1,j,grid)
leetcode 岛屿的个数 python的更多相关文章
- [LeetCode] Number of Distinct Islands II 不同岛屿的个数之二
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- [LeetCode] Number of Distinct Islands 不同岛屿的个数
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- [LeetCode] 711. Number of Distinct Islands II 不同岛屿的个数之二
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- [LeetCode] 694. Number of Distinct Islands 不同岛屿的个数
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- lintcode:Number of Islands 岛屿的个数
题目: 岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 样例 在矩阵: [ [1, 1, 0, 0, 0], ...
- LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他
LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...
- LeetCode初级算法的Python实现--链表
LeetCode初级算法的Python实现--链表 之前没有接触过Python编写的链表,所以这里记录一下思路.这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出. 首先定义 ...
- LeetCode初级算法的Python实现--字符串
LeetCode初级算法的Python实现--字符串 # 反转字符串 def reverseString(s): return s[::-1] # 颠倒数字 def reverse(x): if x ...
- 【数据结构】Hash表简介及leetcode两数之和python实现
文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...
随机推荐
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- JavaScript事件模拟元素拖动
一.前言: 最近要实现一个元素拖放效果,鼠标拖动元素并且定位元素,首先想到的是HTML5中的拖放,在HTML5中,有一个draggable属性,且有dragstart, dragover, drop等 ...
- JavaScript模拟QQ签名(HTML5 contenteditable属性)
例图: 一.思路 1.单击元素时,使元素可以编辑,并获得焦点 2.按下键盘检测用户编辑元素中的文本 3.监听按下Enter键操作或离开可编辑元素焦点时,更新数据库 二.代码 $(function(){ ...
- HTML5 defer和async的区别
在HTML页面中插入Javascript的主要方法,就是使用<script>元素.这个元素由Netscape创造并在Netscape Navigator 2中首先实现.后来,这个元素就被加 ...
- 01 uni-app框架学习:项目创建及底部导航栏tabBar配置
1.创建一个项目类型选择uniapp 2. pages里新建3个页面如下 3.在pages.json中配置底部导航tabBar 效果展示:
- C# Json To Object 无废话
json字符串如下: { success : 0, errorMsg : "错误消息", data : { total : "总记录数", rows : [ { ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- Spring加载XML配置文件
原创链接:http://www.cnblogs.com/yanqin/p/5282929.html(允许转载,但请注明原创链接) BeanFactory加载单个文件 当使用beanfactory去获取 ...
- java Comparator和Comparable(比较器)
Comparable: 一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序,sort方法调用compareTo()方法里定义 ...
- (三)发布Dubbo服务
我们现在来学习下发布Dubbo服务,主要参考dubbo开发包里的demo源码:由浅入深的讲解下这个小demo: github地址:https://github.com/apache/incubator ...