What if you could instantly find all hidden islands on a map without missing a single one?
Why Number of Islands BFS and DFS in DSA Java?
Imagine you have a big map made of squares, some are water and some are land. You want to count how many separate islands are on the map. Doing this by looking at each square and trying to remember which ones you already counted is like trying to count groups of friends in a huge crowd without any help.
Manually checking each square and remembering which lands belong to which island is slow and confusing. You might count the same island twice or miss some parts. It's easy to get lost and make mistakes, especially when islands are close or oddly shaped.
Using BFS (Breadth-First Search) or DFS (Depth-First Search) helps you explore each island fully before moving to the next. These methods let you start from one land square and find all connected land squares automatically, marking them as visited so you never count the same island twice.
int countIslands(char[][] map) {
int count = 0;
// Manually check each cell and try to track visited lands
// Very complex and error-prone
return count;
}int countIslands(char[][] map) {
int count = 0;
boolean[][] visited = new boolean[map.length][map[0].length];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if (map[i][j] == '1' && !visited[i][j]) {
dfs(map, visited, i, j);
count++;
}
}
}
return count;
}It lets you quickly and correctly count all islands in a map, no matter how complex their shapes or sizes are.
Think of a satellite image showing patches of forest (land) surrounded by water. Using BFS or DFS, you can count how many separate forest patches exist without missing or double counting any.
Manual counting of islands is confusing and error-prone.
BFS and DFS explore connected lands fully and mark them visited.
This method ensures accurate and efficient island counting.
Practice
Solution
Step 1: Understand the problem goal
The problem asks to count distinct islands, where islands are groups of connected '1's horizontally or vertically.Step 2: Clarify what to count
We count how many such groups exist, not their sizes or total land cells.Final Answer:
Count how many separate groups of connected lands (islands) exist -> Option BQuick Check:
Number of islands = count of connected land groups [OK]
- Counting total land cells instead of groups
- Including diagonal connections as connected
- Confusing largest island size with count
Solution
Step 1: Identify correct queue initialization
In Java, Queue is an interface; LinkedList implements Queue. So, Queue queue = new LinkedList<>(); is correct.Step 2: Check other options for errors
Queue queue = new Queue(); uses 'new Queue()' which is invalid (Queue is interface). LinkedList queue = new Queue<>(); reverses types. Queue<int> queue = new ArrayList<>(); uses ArrayList which does not implement Queue.Final Answer:
Queue queue = new LinkedList<>(); -> Option AQuick Check:
Queue interface + LinkedList implementation = correct [OK]
- Trying to instantiate interface Queue directly
- Using ArrayList instead of a Queue implementation
- Wrong generic types for queue elements
char[][] grid = {
{'1','1','0','0','0'},
{'1','1','0','0','0'},
{'0','0','1','0','0'},
{'0','0','0','1','1'}
};What is the output of a correct Number of Islands BFS or DFS implementation on this grid?
Solution
Step 1: Identify islands in the grid
First island: top-left 2x2 block of '1's. Second island: single '1' at grid[2][2]. Third island: bottom-right 2 connected '1's.Step 2: Count total islands
There are 3 separate islands in total.Final Answer:
3 -> Option DQuick Check:
Count distinct connected land groups = 3 [OK]
- Counting diagonal connections as connected
- Missing single-cell islands
- Counting total '1's instead of groups
void dfs(char[][] grid, int r, int c) {
if (r < 0 || c < 0 || r >= grid.length || c >= grid[0].length || grid[r][c] == '0')
return;
grid[r][c] = '0';
dfs(grid, r + 1, c);
dfs(grid, r - 1, c);
dfs(grid, r, c + 1);
dfs(grid, r, c - 1);
}What is the main bug if the grid is empty (zero rows)?
Solution
Step 1: Analyze grid access for empty grid
If grid has zero rows, grid.length == 0, so grid[0] access causes IndexOutOfBoundsException.Step 2: Identify cause of exception
Accessing grid[0].length without checking grid length first causes error.Final Answer:
IndexOutOfBoundsException when accessing grid[0].length -> Option AQuick Check:
Empty grid means grid[0] invalid access [OK]
- Assuming grid always has at least one row
- Ignoring boundary checks before accessing grid[0]
- Confusing NullPointerException with IndexOutOfBoundsException
Solution
Step 1: Understand BFS traversal per island
BFS visits all connected land cells of one island. Counting visited cells during BFS gives island size.Step 2: Track largest island size
Keep a max variable updated with the largest count found after each BFS traversal.Final Answer:
During BFS, count cells visited per island and track max count across islands -> Option CQuick Check:
Count cells per BFS, track max size [OK]
- Counting total land cells instead of per island
- Assuming BFS cannot count sizes
- Estimating size without traversal
Ready to prove it?
Pass the test and this pattern moves unknown
