Skip to content

Commit 6470ec9

Browse files
committed
feat: add solutions to lc/lcof2 problems
lc No.0695 & lcof2 No.105. Max Area of Island
1 parent 129c43f commit 6470ec9

File tree

14 files changed

+823
-717
lines changed

14 files changed

+823
-717
lines changed

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

+217-177
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
class Solution {
22
public:
3+
int m;
4+
int n;
5+
36
int maxAreaOfIsland(vector<vector<int>>& grid) {
4-
int m = grid.size(), n = grid[0].size();
5-
int res = 0;
6-
for (int i = 0; i < m; ++i) {
7-
for (int j = 0; j < n; ++j) {
8-
int t = dfs(grid, i, j, m, n);
9-
res = max(res, t);
10-
}
11-
}
12-
return res;
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;
1315
}
14-
private:
15-
vector<vector<int>> directions = {{0, 1}, {0, - 1}, {1, 0}, {-1, 0}};
1616

17-
int dfs(vector<vector<int>>& grid, int i, int j, int m, int n) {
18-
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0) {
19-
return 0;
20-
}
17+
int dfs(int i, int j, vector<vector<int>>& grid) {
2118
grid[i][j] = 0;
22-
int res = 1;
23-
for (auto direction : directions) {
24-
res += dfs(grid, i + direction[0], j + direction[1], m, n);
19+
int ans = 1;
20+
vector<int> dirs = {-1, 0, 1, 0, -1};
21+
for (int k = 0; k < 4; ++k)
22+
{
23+
int x = i + dirs[k];
24+
int y = j + dirs[k + 1];
25+
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1)
26+
ans += dfs(x, y, grid);
2527
}
26-
return res;
28+
return ans;
2729
}
28-
2930
};

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

+13-37
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,27 @@
1-
var p []int
2-
31
func maxAreaOfIsland(grid [][]int) int {
42
m, n := len(grid), len(grid[0])
5-
p = make([]int, m*n)
6-
size := make([]int, m*n)
7-
for i := 0; i < m; i++ {
8-
for j := 0; j < n; j++ {
9-
p[i*n+j] = i*n + j
10-
size[i*n+j] = 1
11-
}
12-
}
13-
for i := 0; i < m; i++ {
14-
for j := 0; j < n; j++ {
15-
if grid[i][j] == 1 {
16-
if i < m-1 && grid[i+1][j] == 1 {
17-
a, b := find(i*n+j), find((i+1)*n+j)
18-
if a != b {
19-
size[a] += size[b]
20-
}
21-
p[b] = a
22-
}
23-
if j < n-1 && grid[i][j+1] == 1 {
24-
a, b := find(i*n+j), find(i*n+j+1)
25-
if a != b {
26-
size[a] += size[b]
27-
}
28-
p[b] = a
29-
}
3+
dirs := []int{-1, 0, 1, 0, -1}
4+
var dfs func(i, j int) int
5+
dfs = func(i, j int) int {
6+
grid[i][j] = 0
7+
ans := 1
8+
for k := 0; k < 4; k++ {
9+
x, y := i+dirs[k], j+dirs[k+1]
10+
if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 {
11+
ans += dfs(x, y)
3012
}
3113
}
14+
return ans
3215
}
33-
res := 0
16+
ans := 0
3417
for i := 0; i < m; i++ {
3518
for j := 0; j < n; j++ {
3619
if grid[i][j] == 1 {
37-
res = max(res, size[i*n+j])
20+
ans = max(ans, dfs(i, j))
3821
}
3922
}
4023
}
41-
return res
42-
}
43-
44-
func find(x int) int {
45-
if p[x] != x {
46-
p[x] = find(p[x])
47-
}
48-
return p[x]
24+
return ans
4925
}
5026

5127
func max(a, b int) int {
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
class Solution {
2-
private int[][] directions = {{0, 1}, {0, - 1}, {1, 0}, {-1, 0}};
2+
private int[][] grid;
3+
private int m;
4+
private int n;
35

46
public int maxAreaOfIsland(int[][] grid) {
5-
int m = grid.length, n = grid[0].length;
6-
int res = 0;
7+
m = grid.length;
8+
n = grid[0].length;
9+
this.grid = grid;
10+
int ans = 0;
711
for (int i = 0; i < m; ++i) {
812
for (int j = 0; j < n; ++j) {
9-
int t = dfs(grid, i, j, m, n);
10-
res = Math.max(res, t);
13+
if (grid[i][j] == 1) {
14+
ans = Math.max(ans, dfs(i, j));
15+
}
1116
}
1217
}
13-
return res;
18+
return ans;
1419
}
1520

16-
private int dfs(int[][] grid, int i, int j, int m, int n) {
17-
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0) {
18-
return 0;
19-
}
21+
private int dfs(int i, int j) {
2022
grid[i][j] = 0;
21-
int res = 1;
22-
for (int[] direction : directions) {
23-
res += dfs(grid, i + direction[0], j + direction[1], m, n);
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+
}
2431
}
25-
return res;
32+
return ans;
2633
}
2734
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
class Solution:
22
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
3-
def dfs(grid, i, j, m, n):
4-
if i < 0 or i >= m or j < 0 or j >= n or grid[i][j] == 0:
5-
return 0
3+
def dfs(i, j):
64
grid[i][j] = 0
7-
res = 1
8-
for x, y in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
9-
res += dfs(grid, i + x, j + y, m, n)
10-
return res
11-
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+
1212
m, n = len(grid), len(grid[0])
13-
res = 0
14-
for i in range(m):
15-
for j in range(n):
16-
t = dfs(grid, i, j, m, n)
17-
res = max(res, t)
18-
return res
13+
return max([dfs(i, j) for i in range(m) for j in range(n) if grid[i][j] == 1], default=0)
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,26 @@
11
function maxAreaOfIsland(grid: number[][]): number {
2-
let m = grid.length,
3-
n = grid[0].length;
4-
let res = 0;
2+
const m = grid.length;
3+
const n = grid[0].length;
4+
let ans = 0;
5+
const dirs = [-1, 0, 1, 0, -1];
6+
let dfs = function (i, j) {
7+
grid[i][j] = 0;
8+
let ans = 1;
9+
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) {
13+
ans += dfs(x, y);
14+
}
15+
}
16+
return ans;
17+
};
518
for (let i = 0; i < m; ++i) {
619
for (let j = 0; j < n; ++j) {
720
if (grid[i][j] == 1) {
8-
res = Math.max(dfs(grid, i, j), res);
21+
ans = Math.max(ans, dfs(i, j));
922
}
1023
}
1124
}
12-
return res;
13-
}
14-
15-
function dfs(grid: number[][], i: number, j: number): number {
16-
let m = grid.length,
17-
n = grid[0].length;
18-
if (i < 0 || i > m - 1 || j < 0 || j > n - 1 || grid[i][j] == 0) {
19-
return 0;
20-
}
21-
grid[i][j] = 0;
22-
let res = 1;
23-
for (let [dx, dy] of [
24-
[0, 1],
25-
[0, -1],
26-
[1, 0],
27-
[-1, 0],
28-
]) {
29-
res += dfs(grid, i + dx, j + dy);
30-
}
31-
return res;
25+
return ans;
3226
}

0 commit comments

Comments
 (0)