leetcode463 岛屿的周长

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012343179/article/details/90108928

本题的最佳思路看起来不难,但我一开始没想出来,即:一次遍历矩阵中所有元素,如果该元素为岛屿则加4,并判断该元素的左边和上边是否为岛屿,如果是则减2。

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        row = len(grid)
        column = len(grid[0])
        island_count = 0
        repeat_border  = 0
        for r in range(row):
            for c in range(column):
                if grid[r][c] == 1:
                    island_count += 1
                    if    c+1   <   column    and   grid[r][c] == grid[r][c+1] :
                        repeat_border += 1
                    if    r > 0   and    grid[r][c]  ==  grid[r-1][c] :
                        repeat_border += 1
        return island_count*4 - 2*repeat_border

 我一开始的思路是对每个元素判断上下左右是否是岛屿。

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        '''
        超时做法
        def isWater(i,j,m,n,grid):
            print(i,j,m,n)
            if (i<0 or i>=m) or (j<0 or j>=n):
                return 1
            elif grid[i][j]==0:
                return 1
            return 0
        
        m=len(grid)#m行
        n=len(grid[0])#n列
        result=0
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1:#是陆地
                    result+=isWater(i-1,j,m,n,grid)
                    result+=isWater(i+1,j,m,n,grid)
                    result+=isWater(i,j-1,m,n,grid)
                    result+=isWater(i,j+1,m,n,grid)
                # print(i,j,result)
        return result
        '''

 后面用类似哈希表的方法来做,设置两个矩阵来分别保存元素的上下边和元素的左右边,最后求和。

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        m=len(grid)#m行
        n=len(grid[0])#n列
        rows=[[False for i in range(n)]for j in range(m+1)]#m+1行n列
        cols=[[False for i in range(n+1)]for j in range(m)]#m行n+1列
        
        for i in range(m):
            for j in range(n):
                # print(i,j)
                if grid[i][j]==1:
                    rows[i][j]= not rows[i][j]
                    rows[i+1][j]= not rows[i+1][j]
                    cols[i][j]= not cols[i][j]
                    cols[i][j+1]= not cols[i][j+1]
        result=0
        for r in rows:
            for c in r:
                if c==True:
                    result+=1
        for r in cols:
            for c in r:
                if c==True:
                    result+=1
        return result

猜你喜欢

转载自blog.csdn.net/u012343179/article/details/90108928
今日推荐