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
京公网安备 11010502036488号