Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6a04399

Browse files
committed
feat: add solutions to lc problem: No.1970.Last Day Where You Can Still Cross
1 parent 639f513 commit 6a04399

File tree

6 files changed

+569
-3
lines changed

6 files changed

+569
-3
lines changed

‎solution/1900-1999/1970.Last Day Where You Can Still Cross/README.md‎

Lines changed: 232 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,258 @@
5353
<li><code>cells</code>&nbsp;中的所有格子坐标都是 <strong>唯一</strong>&nbsp;的。</li>
5454
</ul>
5555

56-
5756
## 解法
5857

5958
<!-- 这里可写通用的实现逻辑 -->
6059

60+
逆序并查集。
61+
62+
并查集模板:
63+
64+
模板 1——朴素并查集:
65+
66+
```python
67+
# 初始化,p存储每个点的父节点
68+
p = list(range(n))
69+
70+
# 返回x的祖宗节点
71+
def find(x):
72+
if p[x] != x:
73+
# 路径压缩
74+
p[x] = find(p[x])
75+
return p[x]
76+
77+
# 合并a和b所在的两个集合
78+
p[find(a)] = find(b)
79+
```
80+
81+
模板 2——维护 size 的并查集:
82+
83+
```python
84+
# 初始化,p存储每个点的父节点,size只有当节点是祖宗节点时才有意义,表示祖宗节点所在集合中,点的数量
85+
p = list(range(n))
86+
size = [1] * n
87+
88+
# 返回x的祖宗节点
89+
def find(x):
90+
if p[x] != x:
91+
# 路径压缩
92+
p[x] = find(p[x])
93+
return p[x]
94+
95+
# 合并a和b所在的两个集合
96+
if find(a) != find(b):
97+
size[find(b)] += size[find(a)]
98+
p[find(a)] = find(b)
99+
```
100+
101+
模板 3——维护到祖宗节点距离的并查集:
102+
103+
```python
104+
# 初始化,p存储每个点的父节点,d[x]存储x到p[x]的距离
105+
p = list(range(n))
106+
d = [0] * n
107+
108+
# 返回x的祖宗节点
109+
def find(x):
110+
if p[x] != x:
111+
t = find(p[x])
112+
d[x] += d[p[x]]
113+
p[x] = t
114+
return p[x]
115+
116+
# 合并a和b所在的两个集合
117+
p[find(a)] = find(b)
118+
d[find(a)] = distance
119+
```
120+
61121
<!-- tabs:start -->
62122

63123
### **Python3**
64124

65125
<!-- 这里可写当前语言的特殊实现逻辑 -->
66126

67127
```python
128+
class Solution:
129+
def latestDayToCross(self, row: int, col: int, cells: List[List[int]]) -> int:
130+
n = row * col
131+
p = list(range(n + 2))
132+
grid = [[False] * col for _ in range(row)]
133+
top, bottom = n, n + 1
134+
135+
def find(x):
136+
if p[x] != x:
137+
p[x] = find(p[x])
138+
return p[x]
68139

140+
def check(i, j):
141+
return 0 <= i < row and 0 <= j < col and grid[i][j]
142+
143+
for k in range(len(cells) - 1, -1, -1):
144+
i, j = cells[k][0] - 1, cells[k][1] - 1
145+
grid[i][j] = True
146+
for x, y in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
147+
if check(i + x, j + y):
148+
p[find(i * col + j)] = find((i + x) * col + j + y)
149+
if i == 0:
150+
p[find(i * col + j)] = find(top)
151+
if i == row - 1:
152+
p[find(i * col + j)] = find(bottom)
153+
if find(top) == find(bottom):
154+
return k
155+
return 0
69156
```
70157

71158
### **Java**
72159

73160
<!-- 这里可写当前语言的特殊实现逻辑 -->
74161

75162
```java
163+
class Solution {
164+
private int[] p;
165+
private int row;
166+
private int col;
167+
private boolean[][] grid;
168+
private int[][] dirs = new int[][]{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
169+
170+
public int latestDayToCross(int row, int col, int[][] cells) {
171+
int n = row * col;
172+
this.row = row;
173+
this.col = col;
174+
p = new int[n + 2];
175+
for (int i = 0; i < p.length; ++i) {
176+
p[i] = i;
177+
}
178+
grid = new boolean[row][col];
179+
int top = n, bottom = n + 1;
180+
for (int k = cells.length - 1; k >= 0; --k) {
181+
int i = cells[k][0] - 1, j = cells[k][1] - 1;
182+
grid[i][j] = true;
183+
for (int[] e : dirs) {
184+
if (check(i + e[0], j + e[1])) {
185+
p[find(i * col + j)] = find((i + e[0]) * col + j + e[1]);
186+
}
187+
}
188+
if (i == 0) {
189+
p[find(i * col + j)] = find(top);
190+
}
191+
if (i == row - 1) {
192+
p[find(i * col + j)] = find(bottom);
193+
}
194+
if (find(top) == find(bottom)) {
195+
return k;
196+
}
197+
}
198+
return 0;
199+
}
200+
201+
private int find(int x) {
202+
if (p[x] != x) {
203+
p[x] = find(p[x]);
204+
}
205+
return p[x];
206+
}
207+
208+
private boolean check(int i, int j) {
209+
return i >= 0 && i < row && j >= 0 && j < col && grid[i][j];
210+
}
211+
}
212+
```
213+
214+
### **C++**
215+
216+
```cpp
217+
class Solution {
218+
public:
219+
vector<int> p;
220+
int dirs[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
221+
int row, col;
222+
223+
int latestDayToCross(int row, int col, vector<vector<int>>& cells) {
224+
int n = row * col;
225+
this->row = row;
226+
this->col = col;
227+
p.resize(n + 2);
228+
for (int i = 0; i < p.size(); ++i) p[i] = i;
229+
vector<vector<bool>> grid(row, vector<bool>(col, false));
230+
int top = n, bottom = n + 1;
231+
for (int k = cells.size() - 1; k >= 0; --k)
232+
{
233+
int i = cells[k][0] - 1, j = cells[k][1] - 1;
234+
grid[i][j] = true;
235+
for (auto e : dirs)
236+
{
237+
if (check(i + e[0], j + e[1], grid))
238+
{
239+
p[find(i * col + j)] = find((i + e[0]) * col + j + e[1]);
240+
}
241+
}
242+
if (i == 0) p[find(i * col + j)] = find(top);
243+
if (i == row - 1) p[find(i * col + j)] = find(bottom);
244+
if (find(top) == find(bottom)) return k;
245+
}
246+
return 0;
247+
}
248+
249+
bool check(int i, int j, vector<vector<bool>>& grid) {
250+
return i >= 0 && i < row && j >= 0 && j < col && grid[i][j];
251+
}
252+
253+
int find(int x) {
254+
if (p[x] != x) p[x] = find(p[x]);
255+
return p[x];
256+
}
257+
};
258+
```
259+
260+
### **Go**
261+
262+
```go
263+
var p []int
264+
265+
func latestDayToCross(row int, col int, cells [][]int) int {
266+
n := row * col
267+
p = make([]int, n+2)
268+
for i := 0; i < len(p); i++ {
269+
p[i] = i
270+
}
271+
grid := make([][]bool, row)
272+
for i := 0; i < row; i++ {
273+
grid[i] = make([]bool, col)
274+
}
275+
top, bottom := n, n+1
276+
dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
277+
for k := len(cells) - 1; k >= 0; k-- {
278+
i, j := cells[k][0]-1, cells[k][1]-1
279+
grid[i][j] = true
280+
for _, e := range dirs {
281+
if check(i+e[0], j+e[1], grid) {
282+
p[find(i*col+j)] = find((i+e[0])*col + j + e[1])
283+
}
284+
}
285+
if i == 0 {
286+
p[find(i*col+j)] = find(top)
287+
}
288+
if i == row-1 {
289+
p[find(i*col+j)] = find(bottom)
290+
}
291+
if find(top) == find(bottom) {
292+
return k
293+
}
294+
}
295+
return 0
296+
}
297+
298+
func check(i, j int, grid [][]bool) bool {
299+
return i >= 0 && i < len(grid) && j >= 0 && j < len(grid[0]) && grid[i][j]
300+
}
76301
302+
func find(x int) int {
303+
if p[x] != x {
304+
p[x] = find(p[x])
305+
}
306+
return p[x]
307+
}
77308
```
78309

79310
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /