57. Max Area of Island
grid contains 1 (land) and 0 (water). Return the area (number of cells) of the largest island, using 4-directional connectivity. Return 0 if there is no land.
Example 1
Input:
grid = [[0,1,1],[1,1,0],[0,0,1]]Output:
4Example 2
Input:
grid = [[0,0]]Output:
0Hint 1
Same as Number of Islands, but the flood fill returns how many cells it visited.
Approach 1: DFS returning size ✅
Each flood fill returns its island’s area.
⏱ Time O(m · n)💾 Space O(m · n)
Reference solution for DFS returning size (time O(m · n), space O(m · n)). Each solution passes every test in all four languages.
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
def area(r, c):
if r < 0 or c < 0 or r >= m or c >= n or grid[r][c] != 1:
return 0
grid[r][c] = 0 # mark visited
return 1 + area(r + 1, c) + area(r - 1, c) + area(r, c + 1) + area(r, c - 1)
return max(area(r, c) for r in range(m) for c in range(n))class Solution {
public int maxAreaOfIsland(int[][] grid) {
int best = 0;
for (int r = 0; r < grid.length; r++)
for (int c = 0; c < grid[0].length; c++) best = Math.max(best, area(grid, r, c));
return best;
}
private int area(int[][] g, int r, int c) {
if (r < 0 || c < 0 || r >= g.length || c >= g[0].length || g[r][c] != 1) return 0;
g[r][c] = 0;
return 1 + area(g, r + 1, c) + area(g, r - 1, c) + area(g, r, c + 1) + area(g, r, c - 1);
}
}class Solution {
int area(vector<vector<int>>& g, int r, int c) {
if (r < 0 || c < 0 || r >= (int)g.size() || c >= (int)g[0].size() || g[r][c] != 1) return 0;
g[r][c] = 0;
return 1 + area(g, r + 1, c) + area(g, r - 1, c) + area(g, r, c + 1) + area(g, r, c - 1);
}
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int best = 0;
for (int r = 0; r < (int)grid.size(); r++)
for (int c = 0; c < (int)grid[0].size(); c++) best = max(best, area(grid, r, c));
return best;
}
};function maxAreaOfIsland(grid) {
const m = grid.length, n = grid[0].length;
const area = (r, c) => {
if (r < 0 || c < 0 || r >= m || c >= n || grid[r][c] !== 1) return 0;
grid[r][c] = 0;
return 1 + area(r + 1, c) + area(r - 1, c) + area(r, c + 1) + area(r, c - 1);
};
let best = 0;
for (let r = 0; r < m; r++) for (let c = 0; c < n; c++) best = Math.max(best, area(r, c));
return best;
}Try solving it yourself first. Interviewers care more about how you explain the approach than about the finished code.
Watch the core idea of this problem step by step. Change the input and press Visualize.
Explained in the lesson Graphs: BFS & DFS.
Run your code to see results here.