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表简介 基本思想 ...
随机推荐
- 模拟生成环境的MySQL安装方法-通用二进制方式安装
模拟生成环境的MySQL安装方法-通用二进制方式安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发响应用户请求的网络IO模型 1>.单进程 特点:一个进程响应一个请 ...
- Java基础-二进制以及字符编码简介
Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...
- 函数和常用模块【day06】:shutil模块(四)
本节内容 简书 模块详解 压缩解压 一.简述 我们在日常处理文件时,经常用到os模块,但是有的时候你会发现,像拷贝.删除.打包.压缩等文件操作,在os模块中没有对应的函数去操作,下面我们就来讲讲高级的 ...
- Windows环境下Qwt安装和使用
之前安装过,现在记录下关键步骤,方便后面使用和复习吧. 环境:win10 Qt5.9 Qt Creator 4.3 参考:https://blog.csdn.net/linuxarmsummar ...
- bzoj千题计划206:bzoj1076: [SCOI2008]奖励关
http://www.lydsy.com/JudgeOnline/problem.php?id=1076 很容易想到方程 dp[i][j]表示抛出了i个宝物,已选宝物状态为j的期望最大得分 初始化dp ...
- Spring RedisTemplate操作-List操作(4)
@Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...
- 原生JS 基础总结
0. 好习惯 分号 ; 花括号 {}, var 弄清楚 null , undefined 区别 , isNaN, === 与 == 区别 1. prompt , confirm , alert 不同框 ...
- nodejs图片总结
今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在 ...
- 线性筛的同时得到欧拉函数 (KuangBin板子)
线性筛的思想:每个被筛的数是通过它最小的质因子所筛去的. 这种思想保证了每个数只会被筛一次,从而达到线性.并且,这个思想实现起来非常巧妙(见代码注释)! 因为线性筛的操作中用到了倍数的关系去实现,因此 ...
- python3之模块random随机数
1.random.random() 随机生成一个大于0小于1的随机数. print(random.random()) 0.03064765450719098 2.random.uniform(a,b) ...