463. Island Perimeter

题目

463. Island Perimeter

我的代码(将判断算法写成一个函数)

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        X=len(grid[0])
        Y=len(grid)
        def getPerimeter(x,y):
            count=0
            if y-1<0 or grid[y-1][x]==0:
                count+=1
            if y+1>=Y or grid[y+1][x]==0:
                count+=1
            if x+1>=X or grid[y][x+1]==0:
                count+=1
            if x-1<0 or grid[y][x-1]==0:
                count+=1
            print(count)
            return count
        count=0
        for i in range(X):
            for j in range(Y):
                if grid[j][i]==1:
                    count+=getPerimeter(i,j)
        return count 

优秀代码(算法很巧妙,但挺难理解)

class Solution:
    def islandPerimeter(self, grid: 'List[List[int]]') -> 'int':
        m, n = len(grid), len(grid[0])
        prev = [0]*n
        ans = 0
        for line in grid:
            prevl = 0
            for c, prevu in zip(line, prev):
                if c:# 如果行中值为1
                    ans += 4 - 2*prevu - 2*prevl # 前一个存在-2,上一个存在-2
                prevl = c
            prev = line 
        return ans