Skip to content

Commit a5fc999

Browse files
committed
feat: update solutions to lcs problem: No.03
LCS 03.主题空间
1 parent 6a83374 commit a5fc999

File tree

5 files changed

+111
-139
lines changed

5 files changed

+111
-139
lines changed

Diff for: lcs/LCS 03. 主题空间/README.md

+49-59
Original file line numberDiff line numberDiff line change
@@ -106,32 +106,26 @@ d[find(a)] = distance
106106
```python
107107
class Solution:
108108
def largestArea(self, grid: List[str]) -> int:
109-
m, n = len(grid), len(grid[0])
110-
p = list(range(m * n + 1))
111-
112109
def find(x):
113110
if p[x] != x:
114111
p[x] = find(p[x])
115112
return p[x]
116-
113+
114+
m, n = len(grid), len(grid[0])
115+
p = list(range(m * n + 1))
116+
size = [1] * (m * n + 1)
117+
dirs = [[0, -1], [0, 1], [1, 0], [-1, 0]]
117118
for i in range(m):
118119
for j in range(n):
119120
if i == 0 or i == m - 1 or j == 0 or j == n - 1 or grid[i][j] == '0':
120121
p[find(i * n + j)] = find(m * n)
121122
else:
122-
for x, y in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
123-
if grid[i + x][j + y] == '0' or grid[i][j] == grid[i + x][j + y]:
124-
p[find(i * n + j)] = find((i + x) * n + j + y)
125-
126-
mp = defaultdict(int)
127-
res = 0
128-
for i in range(m):
129-
for j in range(n):
130-
root = find(i * n + j)
131-
if root != find(m * n):
132-
mp[root] += 1
133-
res = max(res, mp[root])
134-
return res
123+
for a, b in dirs:
124+
x, y = i + a, j + b
125+
if (grid[x][y] == '0' or grid[i][j] == grid[x][y]) and find(x * n + y) != find(i * n + j):
126+
size[find(x * n + y)] += size[find(i * n + j)]
127+
p[find(i * n + j)] = find(x * n + y)
128+
return max([size[i * n + j] for i in range(m) for j in range(n) if find(i * n + j) != find(m * n)], default=0)
135129
```
136130

137131
### **Java**
@@ -141,39 +135,44 @@ class Solution:
141135
```java
142136
class Solution {
143137
private int[] p;
144-
private int[][] dirs = new int[][]{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
145138

146139
public int largestArea(String[] grid) {
147-
int m = grid.length, n = grid[0].length();
140+
int m = grid.length;
141+
int n = grid[0].length();
148142
p = new int[m * n + 1];
143+
int[] size = new int[m * n + 1];
149144
for (int i = 0; i < p.length; ++i) {
150145
p[i] = i;
146+
size[i] = 1;
151147
}
148+
int[] dirs = {0, 1, 0, -1, 0};
152149
for (int i = 0; i < m; ++i) {
153150
for (int j = 0; j < n; ++j) {
154151
if (i == 0 || i == m - 1 || j == 0 || j == n - 1 || grid[i].charAt(j) == '0') {
155152
p[find(i * n + j)] = find(m * n);
156153
} else {
157-
for (int[] e : dirs) {
158-
if (grid[i + e[0]].charAt(j + e[1]) == '0' || grid[i].charAt(j) == grid[i + e[0]].charAt(j + e[1])) {
159-
p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
154+
for (int k = 0; k < 4; ++k) {
155+
int x = i + dirs[k];
156+
int y = j + dirs[k + 1];
157+
if (grid[x].charAt(y) == '0' || grid[i].charAt(j) == grid[x].charAt(y)) {
158+
if (find(x * n + y) != find(i * n + j)) {
159+
size[find(x * n + y)] += size[find(i * n + j)];
160+
p[find(i * n + j)] = find(x * n + y);
161+
}
160162
}
161163
}
162164
}
163165
}
164166
}
165-
Map<Integer, Integer> mp = new HashMap<>();
166-
int res = 0;
167+
int ans = 0;
167168
for (int i = 0; i < m; ++i) {
168169
for (int j = 0; j < n; ++j) {
169-
int root = find(i * n + j);
170-
if (root != find(m * n)) {
171-
mp.put(root, mp.getOrDefault(root, 0) + 1);
172-
res = Math.max(res, mp.get(root));
170+
if (find(i * n + j) != find(m * n)) {
171+
ans = Math.max(ans, size[i * n + j]);
173172
}
174173
}
175174
}
176-
return res;
175+
return ans;
177176
}
178177

179178
private int find(int x) {
@@ -240,55 +239,46 @@ public:
240239
### **Go**
241240

242241
```go
243-
var p []int
244-
245242
func largestArea(grid []string) int {
246243
m, n := len(grid), len(grid[0])
247-
p = make([]int, m*n+1)
248-
for i := 0; i < len(p); i++ {
244+
p := make([]int, m*n+1)
245+
size := make([]int, m*n+1)
246+
for i := range p {
249247
p[i] = i
248+
size[i] = 1
249+
}
250+
dirs := []int{-1, 0, 1, 0, -1}
251+
var find func(x int) int
252+
find = func(x int) int {
253+
if p[x] != x {
254+
p[x] = find(p[x])
255+
}
256+
return p[x]
250257
}
251-
252-
dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
253258
for i := 0; i < m; i++ {
254259
for j := 0; j < n; j++ {
255260
if i == 0 || i == m-1 || j == 0 || j == n-1 || grid[i][j] == '0' {
256261
p[find(i*n+j)] = find(m * n)
257262
} else {
258-
for _, e := range dirs {
259-
if grid[i+e[0]][j+e[1]] == '0' || grid[i][j] == grid[i+e[0]][j+e[1]] {
260-
p[find(i*n+j)] = find((i+e[0])*n + j + e[1])
263+
for k := 0; k < 4; k++ {
264+
x, y := i+dirs[k], j+dirs[k+1]
265+
if (grid[x][y] == '0' || grid[i][j] == grid[x][y]) && find(x*n+y) != find(i*n+j) {
266+
size[find(x*n+y)] += size[find(i*n+j)]
267+
p[find(i*n+j)] = find(x*n + y)
261268
}
262269
}
263270
}
264271
}
265272
}
266-
mp := make(map[int]int, 0)
267-
res := 0
273+
ans := 0
268274
for i := 0; i < m; i++ {
269275
for j := 0; j < n; j++ {
270-
root := find(i*n + j)
271-
if root != find(m*n) {
272-
mp[root]++
273-
res = max(res, mp[root])
276+
if find(i*n+j) != find(m*n) && ans < size[i*n+j] {
277+
ans = size[i*n+j]
274278
}
275279
}
276280
}
277-
return res
278-
}
279-
280-
func find(x int) int {
281-
if p[x] != x {
282-
p[x] = find(p[x])
283-
}
284-
return p[x]
285-
}
286-
287-
func max(a, b int) int {
288-
if a > b {
289-
return a
290-
}
291-
return b
281+
return ans
292282
}
293283
```
294284

Diff for: lcs/LCS 03. 主题空间/Solution.cpp

+14-19
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,38 @@
11
class Solution {
22
public:
33
vector<int> p;
4-
int dirs[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
54

65
int largestArea(vector<string>& grid) {
76
int m = grid.size(), n = grid[0].size();
87
p.resize(m * n + 1);
98
for (int i = 0; i < p.size(); ++i) p[i] = i;
9+
vector<int> size(m * n + 1, 1);
10+
vector<int> dirs = {-1, 0, 1, 0, -1};
1011
for (int i = 0; i < m; ++i)
1112
{
1213
for (int j = 0; j < n; ++j)
1314
{
14-
if (i == 0 || i == m - 1 || j == 0 || j == n - 1 || grid[i][j] == '0')
15-
p[find(i * n + j)] = find(m * n);
15+
if (i == 0 || i == m - 1 || j == 0 || j == n - 1 || grid[i][j] == '0') p[find(i * n + j)] = find(m * n);
1616
else
1717
{
18-
for (auto e : dirs)
18+
for (int k = 0; k < 4; ++k)
1919
{
20-
if (grid[i + e[0]][j + e[1]] == '0' || grid[i][j]== grid[i + e[0]][j + e[1]])
21-
p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
20+
int x = i + dirs[k], y = j + dirs[k + 1];
21+
if ((grid[x][y] == '0' || grid[i][j] == grid[x][y]) && find(x * n + y) != find(i * n + j))
22+
{
23+
size[find(x * n + y)] += size[find(i * n + j)];
24+
p[find(i * n + j)] = find(x * n + y);
25+
}
2226
}
2327
}
2428
}
2529
}
26-
unordered_map<int, int> mp;
27-
int res = 0;
30+
int ans = 0;
2831
for (int i = 0; i < m; ++i)
29-
{
3032
for (int j = 0; j < n; ++j)
31-
{
32-
int root = find(i * n + j);
33-
if (root != find(m * n))
34-
{
35-
++mp[root];
36-
res = max(res, mp[root]);
37-
}
38-
}
39-
}
40-
return res;
33+
if (find(i * n + j) != find(m * n))
34+
ans = max(ans, size[i * n + j]);
35+
return ans;
4136
}
4237

4338
int find(int x) {

Diff for: lcs/LCS 03. 主题空间/Solution.go

+21-30
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,41 @@
1-
var p []int
2-
31
func largestArea(grid []string) int {
42
m, n := len(grid), len(grid[0])
5-
p = make([]int, m*n+1)
6-
for i := 0; i < len(p); i++ {
3+
p := make([]int, m*n+1)
4+
size := make([]int, m*n+1)
5+
for i := range p {
76
p[i] = i
7+
size[i] = 1
8+
}
9+
dirs := []int{-1, 0, 1, 0, -1}
10+
var find func(x int) int
11+
find = func(x int) int {
12+
if p[x] != x {
13+
p[x] = find(p[x])
14+
}
15+
return p[x]
816
}
9-
10-
dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
1117
for i := 0; i < m; i++ {
1218
for j := 0; j < n; j++ {
1319
if i == 0 || i == m-1 || j == 0 || j == n-1 || grid[i][j] == '0' {
1420
p[find(i*n+j)] = find(m * n)
1521
} else {
16-
for _, e := range dirs {
17-
if grid[i+e[0]][j+e[1]] == '0' || grid[i][j] == grid[i+e[0]][j+e[1]] {
18-
p[find(i*n+j)] = find((i+e[0])*n + j + e[1])
22+
for k := 0; k < 4; k++ {
23+
x, y := i+dirs[k], j+dirs[k+1]
24+
if (grid[x][y] == '0' || grid[i][j] == grid[x][y]) && find(x*n+y) != find(i*n+j) {
25+
size[find(x*n+y)] += size[find(i*n+j)]
26+
p[find(i*n+j)] = find(x*n + y)
1927
}
2028
}
2129
}
2230
}
2331
}
24-
mp := make(map[int]int, 0)
25-
res := 0
32+
ans := 0
2633
for i := 0; i < m; i++ {
2734
for j := 0; j < n; j++ {
28-
root := find(i*n + j)
29-
if root != find(m*n) {
30-
mp[root]++
31-
res = max(res, mp[root])
35+
if find(i*n+j) != find(m*n) && ans < size[i*n+j] {
36+
ans = size[i*n+j]
3237
}
3338
}
3439
}
35-
return res
36-
}
37-
38-
func find(x int) int {
39-
if p[x] != x {
40-
p[x] = find(p[x])
41-
}
42-
return p[x]
43-
}
44-
45-
func max(a, b int) int {
46-
if a > b {
47-
return a
48-
}
49-
return b
40+
return ans
5041
}

Diff for: lcs/LCS 03. 主题空间/Solution.java

+17-12
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,43 @@
11
class Solution {
22
private int[] p;
3-
private int[][] dirs = new int[][]{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
43

54
public int largestArea(String[] grid) {
6-
int m = grid.length, n = grid[0].length();
5+
int m = grid.length;
6+
int n = grid[0].length();
77
p = new int[m * n + 1];
8+
int[] size = new int[m * n + 1];
89
for (int i = 0; i < p.length; ++i) {
910
p[i] = i;
11+
size[i] = 1;
1012
}
13+
int[] dirs = {0, 1, 0, -1, 0};
1114
for (int i = 0; i < m; ++i) {
1215
for (int j = 0; j < n; ++j) {
1316
if (i == 0 || i == m - 1 || j == 0 || j == n - 1 || grid[i].charAt(j) == '0') {
1417
p[find(i * n + j)] = find(m * n);
1518
} else {
16-
for (int[] e : dirs) {
17-
if (grid[i + e[0]].charAt(j + e[1]) == '0' || grid[i].charAt(j) == grid[i + e[0]].charAt(j + e[1])) {
18-
p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
19+
for (int k = 0; k < 4; ++k) {
20+
int x = i + dirs[k];
21+
int y = j + dirs[k + 1];
22+
if (grid[x].charAt(y) == '0' || grid[i].charAt(j) == grid[x].charAt(y)) {
23+
if (find(x * n + y) != find(i * n + j)) {
24+
size[find(x * n + y)] += size[find(i * n + j)];
25+
p[find(i * n + j)] = find(x * n + y);
26+
}
1927
}
2028
}
2129
}
2230
}
2331
}
24-
Map<Integer, Integer> mp = new HashMap<>();
25-
int res = 0;
32+
int ans = 0;
2633
for (int i = 0; i < m; ++i) {
2734
for (int j = 0; j < n; ++j) {
28-
int root = find(i * n + j);
29-
if (root != find(m * n)) {
30-
mp.put(root, mp.getOrDefault(root, 0) + 1);
31-
res = Math.max(res, mp.get(root));
35+
if (find(i * n + j) != find(m * n)) {
36+
ans = Math.max(ans, size[i * n + j]);
3237
}
3338
}
3439
}
35-
return res;
40+
return ans;
3641
}
3742

3843
private int find(int x) {

0 commit comments

Comments
 (0)