LeetCode 0827. Making A Large Island Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0827. Making A Large Island

Description

You are given an n x n binary matrix grid. You are allowed to change at most one 0 to be 1.

Return the size of the largest island in grid after applying this operation.

An island is a 4-directionally connected group of 1s.

 

Example 1:

Input: grid = [[1,0],[0,1]]
Output: 3
Explanation: Change one 0 to 1 and connect two 1s, then we get an island with area = 3.

Example 2:

Input: grid = [[1,1],[1,0]]
Output: 4
Explanation: Change the 0 to 1 and make the island bigger, only one island with area = 4.

Example 3:

Input: grid = [[1,1],[1,1]]
Output: 4
Explanation: Can't change any 0 to 1, only one island with area = 4.

 

Constraints:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 500
  • grid[i][j] is either 0 or 1.

Solutions

Solution 1: DFS

We can assign a unique identifier to each connected component, using an array p to record the connected component each position belongs to, i.e., p[i][j] represents the connected component number of (i, j). Use an array cnt to record the size of each connected component, i.e., cnt[root] represents the size of the connected component root.

First, we traverse the entire matrix. For each position grid[i][j] = 1 and p[i][j] = 0, we perform a depth-first search on it, mark its connected component as root, and count the size of the connected component.

Then, we traverse the entire matrix again. For each position grid[i][j] = 0, we find the connected components of the four positions above, below, left, and right of it, add up the sizes of these connected components, and add 1 for the current position, to get the maximum island area after changing the current position to 1.

The time complexity is O(n^2), and the space complexity is O(n^2). Where n is the length of the sides of the matrix.

PythonJavaC++GoTypeScriptRust
class Solution: def largestIsland(self, grid: List[List[int]]) -> int: def dfs(i: int, j: int): p[i][j] = root cnt[root] += 1 for a, b in pairwise(dirs): x, y = i + a, j + b if 0 <= x < n and 0 <= y < n and grid[x][y] and p[x][y] == 0: dfs(x, y) n = len(grid) cnt = Counter() p = [[0] * n for _ in range(n)] dirs = (-1, 0, 1, 0, -1) root = 0 for i, row in enumerate(grid): for j, x in enumerate(row): if x and p[i][j] == 0: root += 1 dfs(i, j) ans = max(cnt.values() or [0]) for i, row in enumerate(grid): for j, x in enumerate(row): if x == 0: s = set() for a, b in pairwise(dirs): x, y = i + a, j + b if 0 <= x < n and 0 <= y < n: s.add(p[x][y]) ans = max(ans, sum(cnt[root] for root in s) + 1) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !