Skip to content

Commit 0d0ef59

Browse files
authored
feat: add solutions to lc/lcof2 problems: Max Area of Island (doocs#1544)
1 parent 1ee0120 commit 0d0ef59

File tree

21 files changed

+787
-1474
lines changed

21 files changed

+787
-1474
lines changed

lcof2/剑指 Offer II 105. 岛屿的最大面积/README.md

Lines changed: 104 additions & 375 deletions
Large diffs are not rendered by default.
Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
1-
class Solution {
2-
public:
3-
int m;
4-
int n;
5-
6-
int maxAreaOfIsland(vector<vector<int>>& grid) {
7-
m = grid.size();
8-
n = grid[0].size();
9-
int ans = 0;
10-
for (int i = 0; i < m; ++i)
11-
for (int j = 0; j < n; ++j)
12-
if (grid[i][j] == 1)
13-
ans = max(ans, dfs(i, j, grid));
14-
return ans;
15-
}
16-
17-
int dfs(int i, int j, vector<vector<int>>& grid) {
18-
grid[i][j] = 0;
19-
int ans = 1;
20-
vector<int> dirs = {-1, 0, 1, 0, -1};
21-
for (int k = 0; k < 4; ++k) {
22-
int x = i + dirs[k];
23-
int y = j + dirs[k + 1];
24-
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1)
25-
ans += dfs(x, y, grid);
26-
}
27-
return ans;
28-
}
1+
class Solution {
2+
public:
3+
int maxAreaOfIsland(vector<vector<int>>& grid) {
4+
int m = grid.size(), n = grid[0].size();
5+
int dirs[5] = {-1, 0, 1, 0, -1};
6+
int ans = 0;
7+
function<int(int, int)> dfs = [&](int i, int j) {
8+
if (grid[i][j] == 0) {
9+
return 0;
10+
}
11+
int ans = 1;
12+
grid[i][j] = 0;
13+
for (int k = 0; k < 4; ++k) {
14+
int x = i + dirs[k], y = j + dirs[k + 1];
15+
if (x >= 0 && x < m && y >= 0 && y < n) {
16+
ans += dfs(x, y);
17+
}
18+
}
19+
return ans;
20+
};
21+
for (int i = 0; i < m; ++i) {
22+
for (int j = 0; j < n; ++j) {
23+
ans = max(ans, dfs(i, j));
24+
}
25+
}
26+
return ans;
27+
}
2928
};

lcof2/剑指 Offer II 105. 岛屿的最大面积/Solution.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
func maxAreaOfIsland(grid [][]int) int {
1+
func maxAreaOfIsland(grid [][]int) (ans int) {
22
m, n := len(grid), len(grid[0])
3-
dirs := []int{-1, 0, 1, 0, -1}
3+
dirs := [5]int{-1, 0, 1, 0, -1}
44
var dfs func(i, j int) int
55
dfs = func(i, j int) int {
6-
grid[i][j] = 0
6+
if grid[i][j] == 0 {
7+
return 0
8+
}
79
ans := 1
10+
grid[i][j] = 0
811
for k := 0; k < 4; k++ {
912
x, y := i+dirs[k], j+dirs[k+1]
10-
if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 {
13+
if x >= 0 && x < m && y >= 0 && y < n {
1114
ans += dfs(x, y)
1215
}
1316
}
1417
return ans
1518
}
16-
ans := 0
17-
for i := 0; i < m; i++ {
18-
for j := 0; j < n; j++ {
19-
if grid[i][j] == 1 {
20-
ans = max(ans, dfs(i, j))
21-
}
19+
for i := range grid {
20+
for j := range grid[i] {
21+
ans = max(ans, dfs(i, j))
2222
}
2323
}
24-
return ans
24+
return
2525
}
2626

2727
func max(a, b int) int {
Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
1-
class Solution {
2-
private int[][] grid;
3-
private int m;
4-
private int n;
5-
6-
public int maxAreaOfIsland(int[][] grid) {
7-
m = grid.length;
8-
n = grid[0].length;
9-
this.grid = grid;
10-
int ans = 0;
11-
for (int i = 0; i < m; ++i) {
12-
for (int j = 0; j < n; ++j) {
13-
if (grid[i][j] == 1) {
14-
ans = Math.max(ans, dfs(i, j));
15-
}
16-
}
17-
}
18-
return ans;
19-
}
20-
21-
private int dfs(int i, int j) {
22-
grid[i][j] = 0;
23-
int[] dirs = {-1, 0, 1, 0, -1};
24-
int ans = 1;
25-
for (int k = 0; k < 4; ++k) {
26-
int x = i + dirs[k];
27-
int y = j + dirs[k + 1];
28-
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
29-
ans += dfs(x, y);
30-
}
31-
}
32-
return ans;
33-
}
1+
class Solution {
2+
private int m;
3+
private int n;
4+
private int[][] grid;
5+
6+
public int maxAreaOfIsland(int[][] grid) {
7+
m = grid.length;
8+
n = grid[0].length;
9+
this.grid = grid;
10+
int ans = 0;
11+
for (int i = 0; i < m; ++i) {
12+
for (int j = 0; j < n; ++j) {
13+
ans = Math.max(ans, dfs(i, j));
14+
}
15+
}
16+
return ans;
17+
}
18+
19+
private int dfs(int i, int j) {
20+
if (grid[i][j] == 0) {
21+
return 0;
22+
}
23+
int ans = 1;
24+
grid[i][j] = 0;
25+
int[] dirs = {-1, 0, 1, 0, -1};
26+
for (int k = 0; k < 4; ++k) {
27+
int x = i + dirs[k], y = j + dirs[k + 1];
28+
if (x >= 0 && x < m && y >= 0 && y < n) {
29+
ans += dfs(x, y);
30+
}
31+
}
32+
return ans;
33+
}
3434
}
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
class Solution:
2-
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
3-
def dfs(i, j):
4-
grid[i][j] = 0
5-
ans = 1
6-
for a, b in [[0, -1], [0, 1], [-1, 0], [1, 0]]:
7-
x, y = i + a, j + b
8-
if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
9-
ans += dfs(x, y)
10-
return ans
11-
12-
m, n = len(grid), len(grid[0])
13-
return max(
14-
[dfs(i, j) for i in range(m) for j in range(n) if grid[i][j] == 1],
15-
default=0,
16-
)
1+
class Solution:
2+
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
3+
def dfs(i: int, j: int) -> int:
4+
if grid[i][j] == 0:
5+
return 0
6+
ans = 1
7+
grid[i][j] = 0
8+
dirs = (-1, 0, 1, 0, -1)
9+
for a, b in pairwise(dirs):
10+
x, y = i + a, j + b
11+
if 0 <= x < m and 0 <= y < n:
12+
ans += dfs(x, y)
13+
return ans
14+
15+
m, n = len(grid), len(grid[0])
16+
return max(dfs(i, j) for i in range(m) for j in range(n))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
impl Solution {
2+
fn dfs(grid: &mut Vec<Vec<i32>>, i: usize, j: usize) -> i32 {
3+
if i == grid.len() || j == grid[0].len() || grid[i][j] == 0 {
4+
return 0;
5+
}
6+
grid[i][j] = 0;
7+
let mut res = 1 + Self::dfs(grid, i + 1, j) + Self::dfs(grid, i, j + 1);
8+
if i != 0 {
9+
res += Self::dfs(grid, i - 1, j)
10+
}
11+
if j != 0 {
12+
res += Self::dfs(grid, i, j - 1)
13+
}
14+
res
15+
}
16+
17+
pub fn max_area_of_island(mut grid: Vec<Vec<i32>>) -> i32 {
18+
let m = grid.len();
19+
let n = grid[0].len();
20+
let mut res = 0;
21+
for i in 0..m {
22+
for j in 0..n {
23+
res = res.max(Self::dfs(&mut grid, i, j))
24+
}
25+
}
26+
res
27+
}
28+
}

lcof2/剑指 Offer II 105. 岛屿的最大面积/Solution.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
function maxAreaOfIsland(grid: number[][]): number {
22
const m = grid.length;
33
const n = grid[0].length;
4-
let ans = 0;
54
const dirs = [-1, 0, 1, 0, -1];
6-
let dfs = function (i, j) {
7-
grid[i][j] = 0;
5+
const dfs = (i: number, j: number): number => {
6+
if (grid[i][j] === 0) {
7+
return 0;
8+
}
89
let ans = 1;
10+
grid[i][j] = 0;
911
for (let k = 0; k < 4; ++k) {
10-
const x = i + dirs[k];
11-
const y = j + dirs[k + 1];
12-
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
12+
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
13+
if (x >= 0 && x < m && y >= 0 && y < n) {
1314
ans += dfs(x, y);
1415
}
1516
}
1617
return ans;
1718
};
19+
let ans = 0;
1820
for (let i = 0; i < m; ++i) {
1921
for (let j = 0; j < n; ++j) {
20-
if (grid[i][j] == 1) {
21-
ans = Math.max(ans, dfs(i, j));
22-
}
22+
ans = Math.max(ans, dfs(i, j));
2323
}
2424
}
2525
return ans;

0 commit comments

Comments
 (0)