/**
* Problem: LeetCode 1254 - Number of Closed Islands
* Difficulty: Medium
* Language: Java
* Author: CodeByTushu
*/
class Solution {
public int closedIsland(int[][] grid) {
int m = grid.length, n = grid[0].length;
for (int i = 0; i < m; i++) {
if (grid[i][0] == 0) dfs(grid, i, 0);
if (grid[i][n - 1] == 0) dfs(grid, i, n - 1);
}
for (int j = 0; j < n; j++) {
if (grid[0][j] == 0) dfs(grid, 0, j);
if (grid[m - 1][j] == 0) dfs(grid, m - 1, j);
}
int count = 0;
for (int i = 1; i < m - 1; i++) {
for (int j = 1; j < n - 1; j++) {
if (grid[i][j] == 0) {
count++;
dfs(grid, i, j);
}
}
}
return count;
}
private void dfs(int[][] grid, int i, int j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 1) {
return;
}
grid[i][j] = 1;
dfs(grid, i + 1, j);
dfs(grid, i - 1, j);
dfs(grid, i, j + 1);
dfs(grid, i, j - 1);
}
}
"""
Problem: LeetCode 1254 - Number of Closed Islands
Difficulty: Medium
Language: Python
Author: CodeByTushu
"""
from typing import List
class Solution:
def closedIsland(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
def dfs(i: int, j: int) -> None:
if i < 0 or j < 0 or i >= m or j >= n or grid[i][j] == 1:
return
grid[i][j] = 1
dfs(i + 1, j)
dfs(i - 1, j)
dfs(i, j + 1)
dfs(i, j - 1)
# Flood fill boundary-connected land
for i in range(m):
if grid[i][0] == 0:
dfs(i, 0)
if grid[i][n - 1] == 0:
dfs(i, n - 1)
for j in range(n):
if grid[0][j] == 0:
dfs(0, j)
if grid[m - 1][j] == 0:
dfs(m - 1, j)
count = 0
for i in range(1, m - 1):
for j in range(1, n - 1):
if grid[i][j] == 0:
count += 1
dfs(i, j)
return count
/**
* Problem: LeetCode 1254 - Number of Closed Islands
* Difficulty: Medium
* Language: C++
* Author: CodeByTushu
*/
#include <vector>
using namespace std;
class Solution {
public:
int closedIsland(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
for (int i = 0; i < m; i++) {
if (grid[i][0] == 0) dfs(grid, i, 0);
if (grid[i][n - 1] == 0) dfs(grid, i, n - 1);
}
for (int j = 0; j < n; j++) {
if (grid[0][j] == 0) dfs(grid, 0, j);
if (grid[m - 1][j] == 0) dfs(grid, m - 1, j);
}
int count = 0;
for (int i = 1; i < m - 1; i++) {
for (int j = 1; j < n - 1; j++) {
if (grid[i][j] == 0) {
count++;
dfs(grid, i, j);
}
}
}
return count;
}
private:
void dfs(vector<vector<int>>& grid, int i, int j) {
if (i < 0 || j < 0 || i >= (int)grid.size() || j >= (int)grid[0].size() || grid[i][j] == 1) {
return;
}
grid[i][j] = 1;
dfs(grid, i + 1, j);
dfs(grid, i - 1, j);
dfs(grid, i, j + 1);
dfs(grid, i, j - 1);
}
};
/**
* Problem: LeetCode 1254 - Number of Closed Islands
* Difficulty: Medium
* Language: JavaScript
* Author: CodeByTushu
*/
var closedIsland = function(grid) {
const m = grid.length, n = grid[0].length;
const dfs = (i, j) => {
if (i < 0 || j < 0 || i >= m || j >= n || grid[i][j] === 1) {
return;
}
grid[i][j] = 1;
dfs(i + 1, j);
dfs(i - 1, j);
dfs(i, j + 1);
dfs(i, j - 1);
};
for (let i = 0; i < m; i++) {
if (grid[i][0] === 0) dfs(i, 0);
if (grid[i][n - 1] === 0) dfs(i, n - 1);
}
for (let j = 0; j < n; j++) {
if (grid[0][j] === 0) dfs(0, j);
if (grid[m - 1][j] === 0) dfs(m - 1, j);
}
let count = 0;
for (let i = 1; i < m - 1; i++) {
for (let j = 1; j < n - 1; j++) {
if (grid[i][j] === 0) {
count++;
dfs(i, j);
}
}
}
return count;
};
TIME COMPLEXITY
O(M * N)
SPACE COMPLEXITY
O(M * N)
TOPICS
Array
Breadth-First Search
Depth-First Search
Matrix
Union Find