What is the main goal of the Number of Islands problem?
To count how many separate groups of connected '1's (land) exist in a 2D grid of '1's and '0's (land and water).
Click to reveal answer
beginner
How does Depth-First Search (DFS) help solve the Number of Islands problem?
DFS explores all connected land cells from a starting point, marking them visited to avoid counting the same island multiple times.
Click to reveal answer
beginner
What is the role of Breadth-First Search (BFS) in the Number of Islands problem?
BFS visits all neighbors level by level from a starting land cell, marking connected land cells as visited to count one island.
Click to reveal answer
beginner
In the Number of Islands problem, why do we mark visited cells?
Marking visited cells prevents counting the same land cell multiple times and avoids infinite loops during traversal.
Click to reveal answer
intermediate
What data structures are commonly used for BFS and DFS in the Number of Islands problem?
DFS uses a stack (or recursion call stack), and BFS uses a queue to keep track of cells to visit next.
Click to reveal answer
What does a '1' represent in the Number of Islands grid?
AObstacle
BWater
CVisited cell
DLand
✗ Incorrect
'1' represents land cells where islands can form.
Which traversal method uses a queue to explore neighbors?
ADepth-First Search (DFS)
BBreadth-First Search (BFS)
CBinary Search
DLinear Search
✗ Incorrect
BFS uses a queue to explore neighbors level by level.
Why do we need to mark cells as visited in the Number of Islands problem?
ATo speed up the program by skipping land
BTo count water cells
CTo avoid counting the same island multiple times
DTo change land to water
✗ Incorrect
Marking visited cells prevents recounting the same island.
What is the time complexity of the Number of Islands solution using BFS or DFS?
AO(m*n) where m and n are grid dimensions
BO(log n)
CO(n^2) where n is grid size
DO(n!)
✗ Incorrect
Each cell is visited once, so time complexity is O(m*n).
Which of these is NOT a valid neighbor direction in Number of Islands problem?
ADiagonal
BDown
CLeft
DUp
✗ Incorrect
Only up, down, left, and right neighbors are considered, not diagonal.
Explain how DFS is used to count islands in a grid.
Think about how you would explore all connected parts of one island.
You got /4 concepts.
Describe the difference between BFS and DFS approaches in the Number of Islands problem.
Focus on traversal order and data structures used.
You got /4 concepts.
Practice
(1/5)
1. What does the "Number of Islands" problem ask you to find in a grid of '1's and '0's?
easy
A. Count how many groups of connected '1's (islands) are in the grid
B. Find the largest island size
C. Count all '0's in the grid
D. Calculate the perimeter of islands
Solution
Step 1: Understand the grid content
The grid contains '1's representing land and '0's representing water.
Step 2: Define the problem goal
We need to count how many separate groups of connected '1's (islands) exist.
Final Answer:
Count how many groups of connected '1's (islands) are in the grid -> Option A
Quick Check:
Number of islands = count of connected '1' groups [OK]
Hint: Islands = connected '1's groups in grid [OK]
Common Mistakes:
Counting individual '1's instead of groups
Confusing '0's as islands
Trying to find island size instead of count
2. Which of the following Go code snippets correctly starts a DFS from cell (i, j) in a grid to mark connected land?
easy
A. func dfs(grid [][]byte, i, j int) { if grid[i][j] == '1' { grid[i][j] = '1' } }
B. func dfs(grid [][]byte, i, j int) { for i < len(grid) { for j < len(grid[0]) { grid[i][j] = '0' } } }
C. func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { 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) }
D. func dfs(grid [][]byte, i, j int) { if i > len(grid) || j > len(grid[0]) { return } grid[i][j] = '1' }
Solution
Step 1: Check boundary and water conditions
func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { 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) } correctly checks if indices are out of bounds or cell is water ('0'), then returns.
Step 2: Mark current land as visited and recurse
func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { 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) } marks current cell as '0' to avoid revisiting and calls dfs on neighbors up, down, left, right.
Final Answer:
func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { 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) } -> Option C
Quick Check:
DFS marks visited land and explores neighbors [OK]
Hint: Check boundaries and mark visited before recursive calls [OK]
Common Mistakes:
Not checking boundaries before access
Not marking visited cells
Using wrong loop instead of recursion
3. What is the output of the following Go code that counts islands using BFS on this grid?
grid := [][]byte{
{'1','1','0','0','0'},
{'1','1','0','0','0'},
{'0','0','1','0','0'},
{'0','0','0','1','1'},
}
count := numIslands(grid)
fmt.Println(count)
func numIslands(grid [][]byte) int {
rows, cols := len(grid), len(grid[0])
count := 0
directions := [][]int{{1,0},{-1,0},{0,1},{0,-1}}
for i := 0; i < rows; i++ {
for j := 0; j < cols; j++ {
if grid[i][j] == '1' {
count++
queue := [][]int{{i,j}}
grid[i][j] = '0'
for len(queue) > 0 {
r, c := queue[0][0], queue[0][1]
queue = queue[1:]
for _, d := range directions {
nr, nc := r+d[0], c+d[1]
if nr >= 0 && nr < rows && nc >= 0 && nc < cols && grid[nr][nc] == '1' {
queue = append(queue, []int{nr,nc})
grid[nr][nc] = '0'
}
}
}
}
}
}
return count
}
medium
A. 1
B. 3
C. 4
D. 2
Solution
Step 1: Identify islands in the grid
There are three groups of connected '1's: top-left block, middle single '1', bottom-right block.
Step 2: BFS marks visited and counts islands
Each BFS call marks one island, so count increments 3 times.
Final Answer:
3 -> Option B
Quick Check:
Count islands = 3 [OK]
Hint: Count BFS runs triggered by unvisited '1's [OK]
Common Mistakes:
Counting connected '1's individually
Not marking visited cells
Miscounting overlapping islands
4. The following DFS code for counting islands has a bug. What is the main issue?
func dfs(grid [][]byte, i, j int) {
if i < 0 || j < 0 || i > len(grid) || j > len(grid[0]) || grid[i][j] == '0' {
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)
}
medium
A. Boundary checks use '>' instead of '>=' causing out-of-range errors
B. It does not mark visited cells
C. It uses BFS instead of DFS
D. It does not check if grid[i][j] is '1'
Solution
Step 1: Analyze boundary conditions
The code uses 'i > len(grid)' and 'j > len(grid[0])' which allows i or j to equal length, causing index out of range.
Step 2: Correct boundary check
It should use 'i >= len(grid)' and 'j >= len(grid[0])' to prevent invalid access.
Final Answer:
Boundary checks use '>' instead of '>=' causing out-of-range errors -> Option A
Quick Check:
Use '>=' for boundary checks to avoid errors [OK]
Hint: Use '>=' for boundary checks in arrays [OK]
Common Mistakes:
Using '>' instead of '>=' in boundary checks
Forgetting to mark visited cells
Mixing BFS and DFS logic
5. Given a grid where diagonal connections also count as connected land, how would you modify the BFS or DFS approach to count islands correctly?
hard
A. Count islands without marking visited cells
B. Only check horizontal neighbors, ignore vertical and diagonal
C. Use BFS only without any direction changes
D. Add diagonal directions (top-left, top-right, bottom-left, bottom-right) to the neighbors list
Solution
Step 1: Understand connection rules
Diagonal connections mean neighbors include 8 directions, not just 4 (up, down, left, right).
Step 2: Modify neighbor directions
Add diagonal directions: (-1,-1), (-1,1), (1,-1), (1,1) to the directions list used in BFS/DFS.
Final Answer:
Add diagonal directions (top-left, top-right, bottom-left, bottom-right) to the neighbors list -> Option D
Quick Check:
Include diagonals in neighbors for diagonal connectivity [OK]
Hint: Add diagonals to directions for 8-way connectivity [OK]
Common Mistakes:
Ignoring diagonal neighbors
Not updating directions list
Counting without marking visited
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.