题目描述
思路
难点是怎么judge两个岛屿是相同的
- 这里一种方法是:岛屿左上角的那个坐标设为
(x, y)
,然后岛屿内的每个元素都减去这个值,存成集合来判断两个集合是否相等
class Solution:
def numDistinctIslands(self, grid: List[List[int]]) -> int:
directions = [[-1, 0], [0, -1], [1, 0], [0, 1]]
def dfs(x, y, mid_list, std_x, std_y):
if grid[x][y]:
mid_list.add((x-std_x, y-std_y))
grid[x][y] = 0
for a, b in directions:
if 0<=x+a<len(grid) and 0<=y+b<len(grid[0]):
if grid[x+a][y+b]:
dfs(x+a, y+b, self.mid_list, std_x, std_y)
cnt = 0
res = []
m, n = len(grid), len(grid[0]) # row , column
for i in range(m):
for j in range(n):
if grid[i][j]:
self.mid_list = set() # 需要比较的集合
dfs(i, j, self.mid_list, i, j) # 最后两个参数 i, j是要减去的base坐标
key = True
for one in res:
if one == self.mid_list:
key = False
break
res.append(self.mid_list) # 将该岛屿加入到res中
if key: # 若和所有岛屿都不相同
cnt += 1
return cnt
- Time: O ( m ∗ n ) O(m*n) O(m∗n)
- Space: O ( m ∗ n ) O(m*n) O(m∗n)