题目:原题链接(困难)
标签:哈希表、图、广度优先搜索、深度优先搜索
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | O ( N × M + I ) : 其中I为岛屿数量 | O ( I ) | 320ms (60.87%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
class Solution:
def numDistinctIslands(self, grid: List[List[int]]):
visited = set()
islands = set()
size1, size2 = len(grid), len(grid[0])
for i1 in range(size1):
for i2 in range(size2):
if grid[i1][i2] == 0 or (i1, i2) in visited:
continue
land, min1, min2, max1, max2 = {(i1, i2)}, i1, i2, i1, i2
pos_list = collections.deque([(i1, i2)])
while pos_list:
i3, i4 = pos_list.popleft()
if i3 + 1 < size1 and grid[i3 + 1][i4] == 1 and (i3 + 1, i4) not in land:
land.add((i3 + 1, i4))
pos_list.append((i3 + 1, i4))
max1 = max(max1, i3 + 1)
if i4 + 1 < size2 and grid[i3][i4 + 1] == 1 and (i3, i4 + 1) not in land:
land.add((i3, i4 + 1))
pos_list.append((i3, i4 + 1))
max2 = max(max2, i4 + 1)
if i3 - 1 >= 0 and grid[i3 - 1][i4] == 1 and (i3 - 1, i4) not in land:
land.add((i3 - 1, i4))
pos_list.append((i3 - 1, i4))
min1 = min(min1, i3 - 1)
if i4 - 1 >= 0 and grid[i3][i4 - 1] == 1 and (i3, i4 - 1) not in land:
land.add((i3, i4 - 1))
pos_list.append((i3, i4 - 1))
min2 = min(min2, i4 - 1)
island = []
for i3 in range(min1, max1 + 1):
row = []
for i4 in range(min2, max2 + 1):
if (i3, i4) in land:
row.append("1")
else:
row.append("0")
island.append("".join(row))
island = " ".join(island)
visited |= land
islands.add(island)
return islands
def numDistinctIslands2(self, grid: List[List[int]]) -> int:
# 对角线翻转
def reverse_diagonal(source):
source = source.split(" ")
ss1, ss2 = len(source), len(source[0])
result = []
for ii1 in range(ss2):
rr = []
for ii2 in range(ss1):
rr.append(source[ii2][ii1])
result.append("".join(rr))
return " ".join(result)
# 水平翻转
def reverse_horizontal(source):
source = source.split(" ")
ss1, ss2 = len(source), len(source[0])
result = []
for ii1 in range(ss1):
rr = []
for ii2 in range(ss2):
rr.append(source[ii1][ss2 - 1 - ii2])
result.append("".join(rr))
return " ".join(result)
# 垂直翻转
def reverse_perpendicular(source):
source = source.split(" ")
ss1, ss2 = len(source), len(source[0])
result = [[] for _ in range(ss1)]
for ii2 in range(ss2):
for ii1 in range(ss1):
result[ii1].append(source[ss1 - 1 - ii1][ii2])
str_result = []
for ii1 in range(ss1):
str_result.append("".join(result[ii1]))
return " ".join(str_result)
# 所有可能
def all_change(source):
yield source
yield reverse_horizontal(source)
yield reverse_perpendicular(source)
yield reverse_horizontal(reverse_perpendicular(source))
yield reverse_diagonal(source)
yield reverse_diagonal(reverse_horizontal(source))
yield reverse_diagonal(reverse_perpendicular(source))
yield reverse_diagonal(reverse_horizontal(reverse_perpendicular(source)))
# 生成所有岛屿
islands = self.numDistinctIslands(grid)
# 岛屿去重
islands_set = set()
for island in islands:
unique = True
for change in all_change(island):
if change in islands_set:
unique = False
break
if unique:
islands_set.add(island)
return len(islands_set)