DFS/BFS space complexity
/*
Time complexity : O(MN)
Space complexity : O(MN)
*/
public int numIslands(char[][] grid) {
int count=0;
for(int i=0;i<grid.length;i++)
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='1'){
dfsFill(grid,i,j);
count++;
}
}
return count;
}
private void dfsFill(char[][] grid,int i, int j){
if(i>=0 && j>=0 && i<grid.length && j<grid[0].length&&grid[i][j]=='1'){
grid[i][j]='0';
dfsFill(grid, i + 1, j);
dfsFill(grid, i - 1, j);
dfsFill(grid, i, j + 1);
dfsFill(grid, i, j - 1);
}
}
class Solution {
public int numIslands(char[][] grid) {
if (grid.length == 0) {
return 0;
}
int m = grid.length, n = grid[0].length;
boolean[][] visited = new boolean[m][n];
Queue<int[]> queue = new LinkedList<>();
int count = 0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(grid[i][j] == '1' && !visited[i][j]) {
queue.offer(new int[]{i, j});
visited[i][j] = true;
bfs(grid, queue, visited);
count++;
}
}
}
return count;
}
int[][] dirs = {{0,1}, {1,0}, {0, -1}, {-1, 0}};
private void bfs(char[][] grid, Queue<int[]> queue, boolean[][] visited) {
int m = grid.length;
int n = grid[0].length;
while(!queue.isEmpty()) {
int[] curr = queue.poll();
for (int[] dir : dirs) {
int x = curr[0] + dir[0];
int y = curr[1] + dir[1];
if (x < 0 || x >= m || y < 0 || y >=n || visited[x][y] || grid[x][y] == '0')
continue;
visited[x][y] = true;
queue.offer(new int[]{x, y});
}
}
}
}
/*
Time complexity : O(M×N)
Space complexity : O(min(M, N)). Because in worst case where the grid is filled with lands,
*/
class Solution {
public int numIslands(char[][] grid) {
if (grid.length == 0) {
return 0;
}
int m = grid.length, n = grid[0].length;
Queue<int[]> queue = new LinkedList<>();
int count = 0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(grid[i][j] == '1') {
queue.offer(new int[]{i, j});
bfs(grid, queue);
count++;
}
}
}
return count;
}
int[][] dirs = {{0,1}, {1,0}, {0, -1}, {-1, 0}};
private void bfs(char[][] grid, Queue<int[]> queue) {
int m = grid.length;
int n = grid[0].length;
while(!queue.isEmpty()) {
int[] curr = queue.poll();
for (int[] dir : dirs) {
int x = curr[0] + dir[0];
int y = curr[1] + dir[1];
if (x < 0 || x >= m || y < 0 || y >=n || grid[x][y] == '0')
continue;
grid[x][y] = '0';
queue.offer(new int[]{x, y});
}
}
}
}