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表简介 基本思想 ...
随机推荐
- Hadoop基础-MapReduce的Partitioner用法案例
Hadoop基础-MapReduce的Partitioner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Partitioner关键代码剖析 1>.返回的分区号 ...
- Why do we make statistics so hard for our students?
Why do we make statistics so hard for our students? (Warning: long and slightly wonkish) If you’re l ...
- 求二叉树中第K层结点的个数
一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...
- 小议 html 实体解析
今天分享个小技巧,是群里一个朋友问的,"请问 + 这种类型的字符串怎么转换成我们想要的字符 + ,有什么简便的js方法吗"其实问题说简单也简单,说难也难.我们要分情况来描述问题解决 ...
- js简单的面试题
1,js有哪些数据类型,数据类型的判断函数? String,Number,Boolean,Null,Undefined,Object 判断函数有:typeof,instanceof,construct ...
- 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...
- es6笔记(2) let 和 const
let命令 用来声明一个变量,和var非常类似 1.使用let声明的变量,所声明的变量只在命令所在的代码块中有效 { let a = 1; console.log(a); // 这里是可以使用的 } ...
- LEARN HOW TO HACK
出处:https://www.hackerone.com/hacker101 什么是HACKER101? https://hacker101.com/Hacker101是一个视频,资源和实践活动的集合 ...
- Mini Twitter
Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...
- 如何生成能在没有安装opencv库及vs2010环境的电脑上运行的exe文件
项目基本算法已经完成,甲方需要一个可以运行的demo.目前,程序能在自己的电脑上正常运行.移植到其他win7系统上,运行失败. 寻找各种解决办法,baidu找到两个办法: 1.使用静态链接的方法,这种 ...