leetcode 463. Island Perimeter
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells). The island doesn't have "lakes" (water inside that isn't connected to the water around the island). One cell is a square with side length 1. The grid is rectangular, width and height don't exceed 100. Determine the perimeter of the island.
Example:
[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] Answer: 16 Explanation: The perimeter is the 16 yellow stripes in the image below:
我的解法:就是数数而已
class Solution(object): def islandPerimeter(self, grid): """ :type grid: List[List[int]] :rtype: int """ # for each element in island, calculate stripes and sum them row = len(grid) col = len(grid[0]) ans = 0 for i in range(0, row): for j in range(0, col): if grid[i][j] == 1: if i==0 or grid[i-1][j] == 0: ans += 1 if i==row-1 or grid[i+1][j] == 0: ans += 1 if j==0 or grid[i][j-1] == 0: ans += 1 if j==col-1 or grid[i][j+1]==0: ans += 1 return ans
更简单的做法,统计为1的矩形个数x,以及上下和左右相邻的边数y,结果为4x-2y
class Solution(object): def islandPerimeter(self, grid): """ :type grid: List[List[int]] :rtype: int """ # for each element in island, calculate stripes and sum them row = len(grid) col = len(grid[0]) ans = 0 for i in range(0, row): for j in range(0, col): if grid[i][j] == 1: ans += 4 if i>0 and grid[i-1][j] == 1: ans -= 2 if j>0 and grid[i][j-1] == 1: ans -= 2 return ans
还有一种DFS版本,
class Solution(object): def islandPerimeter(self, grid): """ :type grid: List[List[int]] :rtype: int """ # for each element in island, calculate stripes and sum them row = len(grid) col = len(grid[0]) self.ans = 0 def dfs(grid,i,j): if i<0 or i>=row or j<0 or j>=col: return if grid[i][j] == 0: return if grid[i][j] == 1: grid[i][j] = -1 if i==0 or grid[i-1][j] == 0: self.ans += 1 if i==row-1 or grid[i+1][j] == 0: self.ans += 1 if j==0 or grid[i][j-1] == 0: self.ans += 1 if j==col-1 or grid[i][j+1]==0: self.ans += 1 dfs(grid, i-1, j) dfs(grid, i+1, j) dfs(grid, i, j-1) dfs(grid, i, j+1) for i in range(0, row): for j in range(0, col): if grid[i][j] == 1: dfs(grid, i, j) return self.ans
DFS的代码结构:
dfs(xxx):
process(xxx.val)
dfs(xxx.left)
dfs(xxx.right)
也就和树的深度优先,先序遍历类似!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2017-03-10 TRIZ发明问题解决理论——本质是分析问题中的矛盾,利用资源(时间空间物质能量功能信息等)来解决矛盾从而解决问题——抽象出来:问题是什么,为什么?
2017-03-10 区块链的技术——账本是去中心化的分布式存储,加密+校验(哈希二叉树)+多数选举来防止篡改