Leetcode_463.岛屿的周长

先定主要思路:
总的边数 - 重叠的边数
(4 * grid中 1 的个数) - (grid中 1 的上下左右存在1的次数和)

主要问题:边界问题

class Solution:
    def islandPerimeter(self, grid):
        die = 0     # 记重叠的边个数
        counter = 0     # 记grid中出现 1 的个数
        m, n = len(grid), len(grid[0])  # 获得grid的规格
 
 # 类似虚拟头结点,要把岛屿用 0 围起来     
        for k in range(m):  # m = 4; n = 4
            # 先在4*4 左右两边各添加两个零,相当于加了8个零,左右各四个零围着
            grid[k].insert(n, 0)
            grid[k].insert(0, 0)
        # 上下各加6个零围起来
        grid.insert(m, [0] * (n + 2))
        grid.insert(0, [0] * (n + 2))
        # 生成了一个 6 * 6 的矩阵了

# 遍历求 counter 和 die
        for i in range(m + 2):
            for j in range(n + 2):
                if grid[i][j]:
                    counter += 1
                    if grid[i - 1][j]:  # 上
                        die += 1
                    if grid[i + 1][j]:  # 下
                        die += 1
                    if grid[i][j - 1]:  # 左
                        die += 1
                    if grid[i][j + 1]:  # 右
                        die += 1
        return counter * 4 - die


S = Solution()
grid = [[0, 1, 0], [1, 1, 0], [0, 1, 0]]
# grid = [[0, 1, 0, 0], [1, 1, 1, 0], [0, 1, 0, 0], [1, 1, 0, 0]]
print(S.islandPerimeter(grid))

详细解释一下把岛屿用0围起来的这段代码:
步骤A

        for k in range(m):  # m = 4; n = 4
            # 先在4*4 左右两边各添加两个零,相当于加了8个零,左右各四个零围着
            grid[k].insert(n, 0)
            grid[k].insert(0, 0)

步骤B

        grid.insert(m, [0] * (n + 2))
        grid.insert(0, [0] * (n + 2))

A、B步骤得到的结果如下图:
Leetcode_463.岛屿的周长_第1张图片

参考别人计算边长的方法:(数1的上下左右0的个数即为边的个数)

	c = 0
    for i in range(1, m + 1):
        for j in range(1, n + 1):
			
            if grid[i][j] == 1:
                c += [grid[i - 1][j], grid[i + 1][j], grid[i][j - 1], grid[i][j + 1]].count(0)
                # 1 上下左右有几个0就有几条边
    return c

你可能感兴趣的:(leetcode,算法,职场和发展)