Skip to content

Commit 1af1b00

Browse files
committed
feat: update solutions to lc/lcs problems
1 parent fa467e6 commit 1af1b00

File tree

8 files changed

+268
-64
lines changed

8 files changed

+268
-64
lines changed

lcs/LCS 02. 完成一半题目/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class Solution:
5353
counter = OrderedDict(counter.most_common())
5454
n = len(questions) >> 1
5555
res = 0
56-
for _, v in counter.items():
56+
for v in counter.values():
5757
res += 1
5858
if v >= n:
5959
return res

lcs/LCS 02. 完成一半题目/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ def halfQuestions(self, questions: List[int]) -> int:
44
counter = OrderedDict(counter.most_common())
55
n = len(questions) >> 1
66
res = 0
7-
for _, v in counter.items():
7+
for v in counter.values():
88
res += 1
99
if v >= n:
1010
return res

solution/0100-0199/0130.Surrounded Regions/README.md

+96-7
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ class Solution:
7171
for i in range(m):
7272
for j in range(n):
7373
if board[i][j] == 'O':
74-
root = find(i * n + j)
7574
if i == 0 or j == 0 or i == m - 1 or j == n - 1:
7675
p[find(i * n + j)] = find(m * n)
7776
else:
@@ -81,10 +80,8 @@ class Solution:
8180

8281
for i in range(m):
8382
for j in range(n):
84-
if find(i * n + j) != find(m * n):
83+
if board[i][j] == 'O' and find(i * n + j) != find(m * n):
8584
board[i][j] = 'X'
86-
else:
87-
board[i][j] = 'O'
8885
```
8986

9087
### **Java**
@@ -121,10 +118,8 @@ class Solution {
121118
}
122119
for (int i = 0; i < m; ++i) {
123120
for (int j = 0; j < n; ++j) {
124-
if (find(i * n + j) != find(m * n)) {
121+
if (board[i][j] == 'O' && find(i * n + j) != find(m * n)) {
125122
board[i][j] = 'X';
126-
} else {
127-
board[i][j] = 'O';
128123
}
129124
}
130125
}
@@ -195,6 +190,100 @@ function dfs(board: string[][], i: number, j: number, visited: boolean[][], edge
195190
}
196191
```
197192

193+
### **C++**
194+
195+
并查集。
196+
197+
```cpp
198+
class Solution {
199+
public:
200+
vector<int> p;
201+
int dirs[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
202+
203+
void solve(vector<vector<char>>& board) {
204+
int m = board.size(), n = board[0].size();
205+
p.resize(m * n + 1);
206+
for (int i = 0; i < p.size(); ++i) p[i] = i;
207+
for (int i = 0; i < m; ++i)
208+
{
209+
for (int j = 0; j < n; ++j)
210+
{
211+
if (board[i][j] == 'O')
212+
{
213+
if (i == 0 || j == 0 || i == m - 1 || j == n - 1) p[find(i * n + j)] = find(m * n);
214+
else
215+
{
216+
for (auto e : dirs)
217+
{
218+
if (board[i + e[0]][j + e[1]] == 'O') p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
219+
}
220+
}
221+
}
222+
}
223+
}
224+
for (int i = 0; i < m; ++i)
225+
{
226+
for (int j = 0; j < n; ++j)
227+
{
228+
if (board[i][j] == 'O' && find(i * n + j) != find(m * n)) board[i][j] = 'X';
229+
}
230+
}
231+
}
232+
233+
int find(int x) {
234+
if (p[x] != x) p[x] = find(p[x]);
235+
return p[x];
236+
}
237+
};
238+
```
239+
240+
### **Go**
241+
242+
并查集。
243+
244+
```go
245+
var p []int
246+
247+
func solve(board [][]byte) {
248+
m, n := len(board), len(board[0])
249+
p = make([]int, m*n+1)
250+
for i := 0; i < len(p); i++ {
251+
p[i] = i
252+
}
253+
dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
254+
for i := 0; i < m; i++ {
255+
for j := 0; j < n; j++ {
256+
if board[i][j] == 'O' {
257+
if i == 0 || j == 0 || i == m-1 || j == n-1 {
258+
p[find(i*n+j)] = find(m * n)
259+
} else {
260+
for _, e := range dirs {
261+
if board[i+e[0]][j+e[1]] == 'O' {
262+
p[find(i*n+j)] = find((i+e[0])*n + j + e[1])
263+
}
264+
}
265+
}
266+
}
267+
268+
}
269+
}
270+
for i := 0; i < m; i++ {
271+
for j := 0; j < n; j++ {
272+
if board[i][j] == 'O' && find(i*n+j) != find(m*n) {
273+
board[i][j] = 'X'
274+
}
275+
}
276+
}
277+
}
278+
279+
func find(x int) int {
280+
if p[x] != x {
281+
p[x] = find(p[x])
282+
}
283+
return p[x]
284+
}
285+
```
286+
198287
### **...**
199288

200289
```

solution/0100-0199/0130.Surrounded Regions/README_EN.md

+96-7
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ class Solution:
6060
for i in range(m):
6161
for j in range(n):
6262
if board[i][j] == 'O':
63-
root = find(i * n + j)
6463
if i == 0 or j == 0 or i == m - 1 or j == n - 1:
6564
p[find(i * n + j)] = find(m * n)
6665
else:
@@ -70,10 +69,8 @@ class Solution:
7069

7170
for i in range(m):
7271
for j in range(n):
73-
if find(i * n + j) != find(m * n):
72+
if board[i][j] == 'O' and find(i * n + j) != find(m * n):
7473
board[i][j] = 'X'
75-
else:
76-
board[i][j] = 'O'
7774
```
7875

7976
### **Java**
@@ -108,10 +105,8 @@ class Solution {
108105
}
109106
for (int i = 0; i < m; ++i) {
110107
for (int j = 0; j < n; ++j) {
111-
if (find(i * n + j) != find(m * n)) {
108+
if (board[i][j] == 'O' && find(i * n + j) != find(m * n)) {
112109
board[i][j] = 'X';
113-
} else {
114-
board[i][j] = 'O';
115110
}
116111
}
117112
}
@@ -182,6 +177,100 @@ function dfs(board: string[][], i: number, j: number, visited: boolean[][], edge
182177
}
183178
```
184179

180+
### **C++**
181+
182+
Union find.
183+
184+
```cpp
185+
class Solution {
186+
public:
187+
vector<int> p;
188+
int dirs[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
189+
190+
void solve(vector<vector<char>>& board) {
191+
int m = board.size(), n = board[0].size();
192+
p.resize(m * n + 1);
193+
for (int i = 0; i < p.size(); ++i) p[i] = i;
194+
for (int i = 0; i < m; ++i)
195+
{
196+
for (int j = 0; j < n; ++j)
197+
{
198+
if (board[i][j] == 'O')
199+
{
200+
if (i == 0 || j == 0 || i == m - 1 || j == n - 1) p[find(i * n + j)] = find(m * n);
201+
else
202+
{
203+
for (auto e : dirs)
204+
{
205+
if (board[i + e[0]][j + e[1]] == 'O') p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
206+
}
207+
}
208+
}
209+
}
210+
}
211+
for (int i = 0; i < m; ++i)
212+
{
213+
for (int j = 0; j < n; ++j)
214+
{
215+
if (board[i][j] == 'O' && find(i * n + j) != find(m * n)) board[i][j] = 'X';
216+
}
217+
}
218+
}
219+
220+
int find(int x) {
221+
if (p[x] != x) p[x] = find(p[x]);
222+
return p[x];
223+
}
224+
};
225+
```
226+
227+
### **Go**
228+
229+
Union find.
230+
231+
```go
232+
var p []int
233+
234+
func solve(board [][]byte) {
235+
m, n := len(board), len(board[0])
236+
p = make([]int, m*n+1)
237+
for i := 0; i < len(p); i++ {
238+
p[i] = i
239+
}
240+
dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
241+
for i := 0; i < m; i++ {
242+
for j := 0; j < n; j++ {
243+
if board[i][j] == 'O' {
244+
if i == 0 || j == 0 || i == m-1 || j == n-1 {
245+
p[find(i*n+j)] = find(m * n)
246+
} else {
247+
for _, e := range dirs {
248+
if board[i+e[0]][j+e[1]] == 'O' {
249+
p[find(i*n+j)] = find((i+e[0])*n + j + e[1])
250+
}
251+
}
252+
}
253+
}
254+
255+
}
256+
}
257+
for i := 0; i < m; i++ {
258+
for j := 0; j < n; j++ {
259+
if board[i][j] == 'O' && find(i*n+j) != find(m*n) {
260+
board[i][j] = 'X'
261+
}
262+
}
263+
}
264+
}
265+
266+
func find(x int) int {
267+
if p[x] != x {
268+
p[x] = find(p[x])
269+
}
270+
return p[x]
271+
}
272+
```
273+
185274
### **...**
186275

187276
```
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,40 @@
11
class Solution {
2-
private:
3-
void dfs(vector<vector<char>>& b,
4-
vector<vector<bool>>& m,
5-
int i, int j)
6-
{
7-
if (i < 0 || i >= b.size()
8-
|| j < 0 || j >= b[0].size())
9-
return ;
10-
11-
if (b[i][j] != 'O' || m[i][j])
12-
return ;
13-
14-
m[i][j] = true ;
15-
dfs(b, m, i-1, j) ;
16-
dfs(b, m, i+1, j) ;
17-
dfs(b, m, i, j-1) ;
18-
dfs(b, m, i, j+1) ;
19-
}
202
public:
3+
vector<int> p;
4+
int dirs[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
5+
216
void solve(vector<vector<char>>& board) {
22-
if (board.size() == 0 || board[0].size() == 0)
23-
return ;
24-
25-
vector<vector<bool>> marks(board.size(), vector<bool>(board[0].size(), false)) ;
26-
const int w_1 = board[0].size() - 1 ;
27-
for (int i = 0; i < w_1; ++i)
7+
int m = board.size(), n = board[0].size();
8+
p.resize(m * n + 1);
9+
for (int i = 0; i < p.size(); ++i) p[i] = i;
10+
for (int i = 0; i < m; ++i)
2811
{
29-
if (board[0][i] == 'O')
30-
dfs(board, marks, 0, i) ;
31-
if (board[board.size()-1][i] == 'O')
32-
dfs(board, marks, board.size()-1, i) ;
12+
for (int j = 0; j < n; ++j)
13+
{
14+
if (board[i][j] == 'O')
15+
{
16+
if (i == 0 || j == 0 || i == m - 1 || j == n - 1) p[find(i * n + j)] = find(m * n);
17+
else
18+
{
19+
for (auto e : dirs)
20+
{
21+
if (board[i + e[0]][j + e[1]] == 'O') p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
22+
}
23+
}
24+
}
25+
}
3326
}
34-
35-
const int h_1 = board.size() - 1 ;
36-
for (int i = 1; i < h_1; ++i)
27+
for (int i = 0; i < m; ++i)
3728
{
38-
if (board[i][0] == 'O')
39-
dfs(board, marks, i, 0) ;
40-
if (board[i][board[0].size()-1] == 'O')
41-
dfs(board, marks, i, board[0].size()-1) ;
29+
for (int j = 0; j < n; ++j)
30+
{
31+
if (board[i][j] == 'O' && find(i * n + j) != find(m * n)) board[i][j] = 'X';
32+
}
4233
}
43-
44-
for (int i = 1; i < h_1; ++i)
45-
for (int j = 1; j < w_1; ++j)
46-
if (board[i][j] == 'O' && !marks[i][j])
47-
board[i][j] = 'X' ;
48-
4934
}
50-
};
35+
36+
int find(int x) {
37+
if (p[x] != x) p[x] = find(p[x]);
38+
return p[x];
39+
}
40+
};

0 commit comments

Comments
 (0)