Привет, уважаемые любители программирования! Сегодня мы собираемся погрузиться в увлекательный мир алгоритмов и решить печально известную проблему «Количества островов». Если вы поклонник задач по кодированию своими руками, вы попали по адресу. В этой статье мы рассмотрим несколько методов решения этой проблемы, используя разговорный язык и примеры кода, чтобы облегчить понимание. Итак, возьмите свой любимый напиток для кодирования, расслабьтесь и начнем!
Метод 1: наивный подход
Первый метод, который мы рассмотрим, — это наивный подход. Вот идея: мы будем перебирать каждую ячейку сетки, и всякий раз, когда мы сталкиваемся с землей (обозначенной «1»), мы увеличиваем счетчик и отмечаем все соседние ячейки земли как посещенные. Давайте посмотрим на код:
def numIslands(grid):
if not grid:
return 0
def dfs(grid, i, j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '0'
dfs(grid, i + 1, j)
dfs(grid, i - 1, j)
dfs(grid, i, j + 1)
dfs(grid, i, j - 1)
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
count += 1
dfs(grid, i, j)
return count
Метод 2: алгоритм поиска объединения
Другим эффективным подходом к решению проблемы «Количество островов» является использование алгоритма поиска объединения. Этот алгоритм помогает нам отслеживать связанные компоненты в графе. Вот как это работает:
- Инициализировать структуру данных поиска объединения, в которой каждая ячейка является отдельным компонентом.
- Пройдитесь по сетке и для каждой ячейки земельного участка объедините ее с соседними ячейками земельного участка.
- Наконец, подсчитайте количество различных компонентов в структуре данных поиска объединения.
Давайте посмотрим код в действии:
class UnionFind:
def __init__(self, n):
self.parent = [i for i in range(n)]
self.rank = [0] * n
self.count = n
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
if self.rank[root_x] < self.rank[root_y]:
self.parent[root_x] = root_y
elif self.rank[root_x] > self.rank[root_y]:
self.parent[root_y] = root_x
else:
self.parent[root_y] = root_x
self.rank[root_x] += 1
self.count -= 1
def numIslands(grid):
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
uf = UnionFind(rows * cols)
for i in range(rows):
for j in range(cols):
if grid[i][j] == '1':
if i > 0 and grid[i - 1][j] == '1':
uf.union(i * cols + j, (i - 1) * cols + j)
if i < rows - 1 and grid[i + 1][j] == '1':
uf.union(i * cols + j, (i + 1) * cols + j)
if j > 0 and grid[i][j - 1] == '1':
uf.union(i * cols + j, i * cols + j - 1)
if j < cols - 1 and grid[i][j + 1] == '1':
uf.union(i * cols + j, i * cols + j + 1)
return uf.count
И вот оно! Мы исследовали два разных метода решения проблемы «Количество островов» — наивный подход и алгоритм Union-Find. Оба подхода эффективны при подсчете количества островов в сетке. Итак, в следующий раз, когда вы столкнетесь с этой проблемой, в вашем наборе инструментов для кодирования будет несколько инструментов, которые помогут с уверенностью решить ее. Приятного кодирования!
Привет, любители программирования! Сегодня мы собираемся углубиться в интригующую проблему подсчета количества островов в сетке. Если вам нравятся задачи по кодированию своими руками, вас ждет удовольствие. В этой статье мы рассмотрим несколько методов решения проблемы «Количество островов». Мы будем использовать разговорный язык и предоставим примеры кода, чтобы вам было легче следовать инструкциям. Итак, берите чашечку кофе, садитесь поудобнее и начнем!
Метод 1: наивный подход
Начнем с простого и понятного метода, который называется «наивный подход». Мы будем перебирать каждую ячейку сетки, и всякий раз, когда мы сталкиваемся с землей (обозначенной «1»), мы увеличиваем счетчик и отмечаем все соседние ячейки земли как посещенные. Вот код:
def numIslands(grid):
if not grid:
return 0
def dfs(grid, i, j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '0'
dfs(grid, i + 1, j)
dfs(grid, i - 1, j)
dfs(grid, i, j + 1)
dfs(grid, i, j - 1)
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
count += 1
dfs(grid, i, j)
return count
Метод 2: алгоритм поиска объединения
Другим эффективным подходом к решению проблемы «Количество островов» является использование алгоритма поиска объединения. Этот алгоритм помогает нам отслеживать связанные компоненты в графе. Вот как это работает:
- Инициализировать структуру данных поиска объединения, в которой каждая ячейка является отдельным компонентом.
- Пройдитесь по сетке и объедините каждую ячейку земельного участка с соседними ячейками земельного участка.
- Наконец, подсчитайте количество различных компонентов в структуре данных поиска объединения.
Давайте посмотрим код в действии:
class UnionFind:
def __init__(self, n):
self.parent = [i for i in range(n)]
self.rank = [0] * n
self.count = n
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
if self.rank[root_x] < self.rank[root_y]:
self.parent[root_x] = root_y
elif self.rank[root_x] > self.rank[root_y]:
self.parent[root_y] = root_x
else:
self.parent[root_y] = root_x
self.rank[root_x] += 1
self.count -= 1
def numIslands(grid):
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
uf = UnionFind(rows * cols)
for i in range(rows):
for j in range(cols):
if grid[i][j] == '1':
if i > 0 and grid[i - 1][j] == '1':
uf.union(i * cols + j, (i - 1) * cols + j)
if i < rows - 1 and grid[i + 1][j] == '1':
uf.union(i * cols + j, (i + 1) * cols + j)
if j > 0 and grid[i][j - 1] == '1':
uf.union(i * cols + j, i * cols + j - 1)
if j < cols - 1 and grid[i][j + 1] == '1':
uf.union(i * cols + j, i * cols + j + 1)
return uf.count
Вот и все! Мы исследовали два разных метода решения проблемы «Количество островов» — наивный подход и алгоритм Union-Find. Оба подхода эффективны при подсчете количества островов в сетке. Итак, в следующий раз, когда вы столкнетесь с этой проблемой, в вашем наборе инструментов для кодирования будет несколько инструментов, которые позволят уверенно ее решить. Приятного кодирования!