Leetcode1020. 飞地的数量(medium)
目录
1. 题目描述
给你一个大小为 m x n
的二进制矩阵 grid
,其中 0
表示一个海洋单元格、1
表示一个陆地单元格。一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid
的边界。返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
示例 1:
输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]] 输出:3 解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:
输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]] 输出:0 解释:所有 1 都在边界上或可以到达边界。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 500
grid[i][j]
的值为0
或1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-enclaves
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题分析
这道题目与Leetcode1254. 统计封闭岛屿的数目(medium)本质上是相同的问题。只不过leetcode1254是统计封闭岛屿的个数,封闭岛屿就是本题说所的飞地,本题改为统计各封闭岛屿的总的面积。所以只需要在leetcode1254的代码的基础上做小幅度的修改即可。
3. 代码实现
from typing import List
from collections import deque
class Solution:
def numEnclaves(self, grid: List[List[int]]) -> int:
if len(grid)==0 or len(grid[0])==0:
return 0
R,C = len(grid),len(grid[0])
totalGridCnt = 0
for r in range(1,len(grid)-1):
for c in range(1,len(grid[0])-1):
if grid[r][c] == 1:
isClosedIsland = True
gridCnt = 1
q = deque([(r,c)])
grid[r][c] = 0
while len(q)>0:
(r0,c0) = q.popleft()
for x,y in [(r0-1,c0),(r0+1,c0),(r0,c0-1),(r0,c0+1)]:
if 0<=x<R and 0<=y<C and grid[x][y]==1:
if x==0 or x==R-1 or y==0 or y==C-1: # Not closed island
isClosedIsland = False
# Even not closed island, the search has to continue to flag the island.
q.append((x,y))
grid[x][y] = 0
gridCnt += 1
totalGridCnt = totalGridCnt + (gridCnt if isClosedIsland else 0)
return totalGridCnt
if __name__ == '__main__':
sln = Solution()
grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
print(sln.numEnclaves(grid))
grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
print(sln.numEnclaves(grid))
执行用时:224 ms, 在所有 Python3 提交中击败了17.98%的用户
内存消耗:16 MB, 在所有 Python3 提交中击败了71.12%的用户
感到有点诧异。。。因为是在leetcode1254的基础上修改的代码,按说其性能表现应该与leetcode1254相当啊?官解除了广度优先搜索和深度优先搜索以外,还给了个基于并查集的解法,难道大部分人在这个问题上都学乖了改用并查集了^-^,好吧看来要学习一下并查集的解法了。
回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)
相关文章
- 如何在新消费时代提升开店数量和营业额
- EasyCVR服务器集群设备列表返回数量异常的排查与优化
- 600+服务模块,1万+POD数量,作业帮从PHP迁移至Go实战总结
- MongoDB:统计查询结果数量(mongodb查询数量)
- Linux:最多线程数量的极限(linux最多线程)
- 限制Linux系统磁盘数量局限性分析(linux磁盘个数)
- 使用nproc命令执行Linux系统中CPU核心数量检测(nproclinux)
- oracle数据库中几个数量字段的重要性(oracle几个数量字段)
- MySQL查询限制最大查询数量是多少(mysql 一次查询上限)
- MySQL统计特定列数量(mysql下统计某列个数)
- Oracle会话数量逐渐减少(oracle会话越来越少)
- Redis优化如何调整进程数量(redis 进程数量)