1020. 飞地的数量
思路:从4条边界出发,把能遍历到的1全部变成0。剩下的1就是边界所不能到达的点,统计一下1的数量即可。
解题思路:DFS。 时间超越100%python用户提交 ,内存超越84.75%的python用户提交。
1 class Solution(object): 2 def numEnclaves(self, A): 3 if not A or not A[0]: # 处理边缘测试用例 4 return 0 5 res = 0 6 self.m = len(A) 7 self.n = len(A[0]) 8 for i in range(self.m): 9 self.dfs(A, i, 0) # 从左边界遍历 10 self.dfs(A, i, self.n-1) # 从有边界遍历 11 for i in range(self.n): 12 self.dfs(A, 0, i) # 从上边界遍历 13 self.dfs(A,self.m-1, i) # 从上边界遍历 14 for each in A: 15 res += sum(each) # 统计非零元素个数 16 return res 17 18 def dfs(self, data, i, j): 19 if i < 0 or i >= self.m or j < 0 or j >= self.n or data[i][j]==0: 20 return 21 data[i][j] = 0 22 self.dfs(data, i+1, j) 23 self.dfs(data, i-1, j) 24 self.dfs(data, i, j+1) 25 self.dfs(data, i, j-1)
思路2:添加辅助空间visit 。从边界出发,找出边界所能直达的1节点,然后用1的总个数减去边界直达1的个数。
时间超越100%的python用户提交,内存超越100%的python用户提交。
1 class Solution(object): 2 def numEnclaves(self, A): 3 if not A or not A[0]: # 处理边缘测试用例 4 return 0 5 res = 0 6 self.count=0 7 self.m = len(A) 8 self.n = len(A[0]) 9 self.index=[[0,1],[1,0],[0,-1],[-1,0]] 10 self.visited=[[0]*len(A[0]) for x in range(self.m)] 11 for i in range(self.m): 12 self.dfs(A, i, 0) # 从左边界遍历 13 self.dfs(A, i, self.n-1) # 右边界遍历 14 for i in range(self.n): 15 self.dfs(A, 0, i) # 从上边界遍历 16 self.dfs(A,self.m-1, i) # 从上边界遍历 17 for each in A: 18 res += sum(each) # 统计非零元素个数 19 return res-self.count 20 21 def dfs(self, data, i, j): 22 if i<0 or i>=self.m or j<0 or j>=self.n or data[i][j]==0 or self.visited[i][j]==1: 23 return 24 if data[i][j] == 1: 25 self.visited[i][j]=1 26 self.count += 1 27 for each in self.index: 28 x = each[0]+i 29 y = j+each[1] 30 self.dfs(data,x,y)