dfs 超时
通过遍历时设置不同的标志,来遍历,也可以通过栈。
时间复杂度:O(N^4)O(N
4
),其中 NN 是 grid 的长和宽。
空间复杂度:O(N^2)O(N
2
),深度优先搜索需要的 stack 和 seen 的空间。

作者:LeetCode
链接:https://leetcode-cn.com/problems/making-a-large-island/solution/zui-da-ren-gong-dao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution:
    def largestIsland(self, grid: List[List[int]]) -> int:

        def dfs(x,y,visit,count,num):


            grid[x][y]=num
            for item in [(1,0),(0,1),(0,-1),(-1,0)]:
                cur_x=x+item[0]
                cur_y=y+item[1]

                if 0<=cur_x<len(grid) and 0<=cur_y<len(grid[0]) and grid[cur_x][cur_y]!=num and grid[cur_x][cur_y]!=0:

                    count+=1

                    count=dfs(cur_x,cur_y,visit,count,num)


            return count

        maxvalue=0
        count=0
        visit=[[0]*len(grid[0]) for _ in range(len(grid))]
        num=2
        for i in range(len(grid)):
            for j in range(len(grid[0])):

                if grid[i][j]==0:

                    grid[i][j]=1
                    print(grid)
                    count=dfs(i,j,visit,1,num)
                    grid[i][j]=0

                    num+=1

                    maxvalue=max(maxvalue,count)
        if maxvalue==0:
            return len(grid)*len(grid[0])
        return maxvalue

通过一次dfs得到所有连通的数量,将连通的位置标记上序号从2开始,因为0,1有意义的,然后遍历为0的位置,看他的上下左右是否有连通的组织,序号不一致的放入数组中,这里可以通过set控制,然后将set中的对应连通组织面积加和,注意数量不限,最后加上1,这里要判断下全1和全0的状态。

class Solution:
    def largestIsland(self, grid: List[List[int]]) -> int:

        def dfs(x,y,visit,count,num):


            grid[x][y]=num
            for item in [(1,0),(0,1),(0,-1),(-1,0)]:
                cur_x=x+item[0]
                cur_y=y+item[1]

                if 0<=cur_x<len(grid) and 0<=cur_y<len(grid[0]) and grid[cur_x][cur_y]==1:

                    count+=1

                    count=dfs(cur_x,cur_y,visit,count,num)


            return count

        maxvalue=0
        count=0
        visit=[[0]*len(grid[0]) for _ in range(len(grid))]
        num=2
        hashmap=collections.defaultdict(int)
        hashset=set()
        for i in range(len(grid)):
            for j in range(len(grid[0])):

                if grid[i][j]==1:


                    count=dfs(i,j,visit,1,num)
                    #print(grid)
                    hashmap[num]=count


                    num+=1

                    maxvalue=max(maxvalue,count)
        if maxvalue==0:
            return 1
        if maxvalue==len(grid)*len(grid[0]):
            return len(grid)*len(grid[0])
        area=0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j]==0:
                    hashset=set()
                    for item in [(1,0),(0,1),(-1,0),(0,-1)]:
                        if 0<=i+item[0]<len(grid) and 0<=j+item[1]<len(grid[0])and grid[i+item[0]][j+item[1]]!=0:
                            hashset.add(grid[i+item[0]][j+item[1]])
                    area=0
                    for k in hashset:

                        area+=hashmap[k]
                    area+=1

                maxvalue=max(maxvalue,area)                

        return maxvalue