1080. 最大的岛

1080. 最大的岛

中文English

给定一个由0和1组成的非空二维数组grid,一个岛由一组四联通(上下左右四方向)的1(表示陆地)组成。假定grid的四周都是水。

返回最大的岛。(没有岛则返回0)

样例

样例 1:

输入:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,1,1,0,1,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,0,0,1,0,1,0,0],
 [0,1,0,0,1,1,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,1,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出:6。
解释:注意不是11!因为是4方向联通。

样例 2:

输入:[[0,0,0,0,0,0,0,0]]
输出:0

注意事项

grid中的每一维度长度都不超过50。

输入测试数据 (每行一个参数)如何理解测试数据?
class Solution:
    """
    @param grid: a 2D array
    @return: the maximum area of an island in the given 2D array
    """
    '''
    大致思路:
    1.初始化self.res = [],max_l = 0,给出一个方法,初始化around_list = [],可以求得四向的岛屿,如果为1而且[x,y]不在self.res里面的话
    添加到around_list里面
    2.给定一个append_land = [],count = 0,self.res是累计的过程,如果append_land = []的话,跳出循环,则需要进行判断max_l与count的大小,然后赋值
    直到所有循环结束。最后返回max_l即可。
    '''
    def __init__(self):
        self.res = []

    def maxAreaOfIsland(self,grid):
        max_l = 0

        #如果是在self.res里面的话,则直接跳过,里面初始化一个append_land = []
        for i in range(len(grid)):
            for j in range(len(grid[i])):
                append_land = []
                #如果当前循环的值不在self.res里面的话
                if [i,j] not in self.res and grid[i][j] == 1:
                    self.res.append([i,j])
                    append_land.append([i,j])
                    count = 0 
                    while append_land != []:
                        count += 1
                        pop_column = append_land.pop(0)
                        l = self.getaroundland(grid,pop_column[0],pop_column[1])
                        append_land.extend(l)
                        self.res.extend(l)

                    ##进行判断
                    if max_l < count:
                        max_l = count
        return max_l
              
    
    def getaroundland(self,grid,x,y):
        around_list = []
        #上方向
        if x-1 >= 0:
            if grid[x-1][y] == 1 and [x-1,y] not in self.res:
                around_list.append([x-1,y])
        
        #下方向
        if x+1 < len(grid):
            if grid[x+1][y] == 1 and [x+1,y] not in self.res:
                around_list.append([x+1,y])
        
        #左方向
        if y-1 >= 0:
            if grid[x][y-1] == 1 and [x,y-1] not in self.res:
                around_list.append([x,y-1])

        #右方向
        if y+1 < len(grid[0]):
            if grid[x][y+1] == 1 and [x,y+1] not in self.res:
                around_list.append([x,y+1])

        return around_list

注:lintcode测试未通过,本地测试通过,待优化。(你的代码运行时间超过了限制,检查你的时间复杂度。TLE通常是由死循环造成的,思考一下你的时间复杂度是否是最优的。)

posted @ 2020-04-06 21:32  风不再来  阅读(167)  评论(0编辑  收藏  举报