Skip to content

Commit 588e981

Browse files
authored
feat: add solutions to lc problem: No.2684 (doocs#2443)
No.2684.Maximum Number of Moves in a Grid
1 parent 15edd0d commit 588e981

File tree

7 files changed

+238
-212
lines changed

7 files changed

+238
-212
lines changed

solution/2600-2699/2684.Maximum Number of Moves in a Grid/README.md

Lines changed: 80 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -54,65 +54,53 @@
5454

5555
### 方法一:BFS
5656

57-
我们定义一个队列 $q$,初始时将第一列的所有单元格 $(i, 0)$ 加入队列,同时定义一个二维数组 $dist$,其中 $dist[i][j]$ 表示到达单元格 $(i, j)$ 的最大移动次数。初始时,$dist[i][j] = 0$
57+
我们定义一个队列 $q$,初始时将第一列的所有行坐标加入队列中
5858

59-
接下来,我们开始进行广度优先搜索。每次取出队首的单元格 $(i, j)$,并考虑其可以到达的下一层的单元格 $(x, y)$。如果 $x$ 和 $y$ 满足 $0 \leq x < m, 0 \leq y < n$,且 $grid[x][y] \gt grid[i][j]$,并且 $dist[x][y] \lt dist[i][j] + 1$,那么我们就可以从单元格 $(i, j)$ 移动到单元格 $(x, y)$,此时我们将 $dist[x][y]$ 更新为 $dist[i][j] + 1$,并将单元格 $(x, y)$ 加入队列 $q$ 中,然后更新答案 $ans = \max(ans, dist[x][y])$
59+
接下来,我们从第一列开始,逐列进行遍历。对于每一列,我们将队列中的所有行坐标依次取出,然后对于每一个行坐标 $i$,我们得到其下一列的所有可能行坐标 $k$,并且满足 $grid[i][j] < grid[k][j + 1]$,将这些行坐标加入到一个新的集合 $t$ 中。如果 $t$ 为空,说明我们无法继续移动,返回当前列数。否则,我们将 $t$ 赋值给 $q$,继续下一列的遍历
6060

61-
当队列为空时,我们就找到了矩阵中移动的最大次数,返回 $ans$ 即可
61+
最后,如果我们遍历完了所有列,说明我们可以移动到最后一列,返回 $n - 1$
6262

63-
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
63+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
6464

6565
<!-- tabs:start -->
6666

6767
```python
6868
class Solution:
6969
def maxMoves(self, grid: List[List[int]]) -> int:
70-
dirs = ((-1, 1), (0, 1), (1, 1))
7170
m, n = len(grid), len(grid[0])
72-
q = deque((i, 0) for i in range(m))
73-
dist = [[0] * n for _ in range(m)]
74-
ans = 0
75-
while q:
76-
i, j = q.popleft()
77-
for a, b in dirs:
78-
x, y = i + a, j + b
79-
if (
80-
0 <= x < m
81-
and 0 <= y < n
82-
and grid[x][y] > grid[i][j]
83-
and dist[x][y] < dist[i][j] + 1
84-
):
85-
dist[x][y] = dist[i][j] + 1
86-
ans = max(ans, dist[x][y])
87-
q.append((x, y))
88-
return ans
71+
q = set(range(m))
72+
for j in range(n - 1):
73+
t = set()
74+
for i in q:
75+
for k in range(i - 1, i + 2):
76+
if 0 <= k < m and grid[i][j] < grid[k][j + 1]:
77+
t.add(k)
78+
if not t:
79+
return j
80+
q = t
81+
return n - 1
8982
```
9083

9184
```java
9285
class Solution {
9386
public int maxMoves(int[][] grid) {
94-
int[][] dirs = {{-1, 1}, {0, 1}, {1, 1}};
9587
int m = grid.length, n = grid[0].length;
96-
Deque<int[]> q = new ArrayDeque<>();
97-
for (int i = 0; i < m; ++i) {
98-
q.offer(new int[] {i, 0});
99-
}
100-
int[][] dist = new int[m][n];
101-
int ans = 0;
102-
while (!q.isEmpty()) {
103-
var p = q.poll();
104-
int i = p[0], j = p[1];
105-
for (var dir : dirs) {
106-
int x = i + dir[0], y = j + dir[1];
107-
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] > grid[i][j]
108-
&& dist[x][y] < dist[i][j] + 1) {
109-
dist[x][y] = dist[i][j] + 1;
110-
ans = Math.max(ans, dist[x][y]);
111-
q.offer(new int[] {x, y});
88+
Set<Integer> q = IntStream.range(0, m).boxed().collect(Collectors.toSet());
89+
for (int j = 0; j < n - 1; ++j) {
90+
Set<Integer> t = new HashSet<>();
91+
for (int i : q) {
92+
for (int k = i - 1; k <= i + 1; ++k) {
93+
if (k >= 0 && k < m && grid[i][j] < grid[k][j + 1]) {
94+
t.add(k);
95+
}
11296
}
11397
}
98+
if (t.isEmpty()) {
99+
return j;
100+
}
101+
q = t;
114102
}
115-
return ans;
103+
return n - 1;
116104
}
117105
}
118106
```
@@ -122,55 +110,74 @@ class Solution {
122110
public:
123111
int maxMoves(vector<vector<int>>& grid) {
124112
int m = grid.size(), n = grid[0].size();
125-
int dist[m][n];
126-
memset(dist, 0, sizeof(dist));
127-
int ans = 0;
128-
queue<pair<int, int>> q;
113+
unordered_set<int> q, t;
129114
for (int i = 0; i < m; ++i) {
130-
q.emplace(i, 0);
115+
q.insert(i);
131116
}
132-
int dirs[3][2] = {{-1, 1}, {0, 1}, {1, 1}};
133-
while (!q.empty()) {
134-
auto [i, j] = q.front();
135-
q.pop();
136-
for (int k = 0; k < 3; ++k) {
137-
int x = i + dirs[k][0], y = j + dirs[k][1];
138-
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] > grid[i][j] && dist[x][y] < dist[i][j] + 1) {
139-
dist[x][y] = dist[i][j] + 1;
140-
ans = max(ans, dist[x][y]);
141-
q.emplace(x, y);
117+
for (int j = 0; j < n - 1; ++j) {
118+
t.clear();
119+
for (int i : q) {
120+
for (int k = i - 1; k <= i + 1; ++k) {
121+
if (k >= 0 && k < m && grid[i][j] < grid[k][j + 1]) {
122+
t.insert(k);
123+
}
142124
}
143125
}
126+
if (t.empty()) {
127+
return j;
128+
}
129+
q.swap(t);
144130
}
145-
return ans;
131+
return n - 1;
146132
}
147133
};
148134
```
149135
150136
```go
151137
func maxMoves(grid [][]int) (ans int) {
152138
m, n := len(grid), len(grid[0])
153-
dist := make([][]int, m)
154-
q := [][2]int{}
155-
for i := range dist {
156-
dist[i] = make([]int, n)
157-
q = append(q, [2]int{i, 0})
139+
q := map[int]bool{}
140+
for i := range grid {
141+
q[i] = true
158142
}
159-
dirs := [][2]int{{-1, 1}, {0, 1}, {1, 1}}
160-
for len(q) > 0 {
161-
p := q[0]
162-
q = q[1:]
163-
i, j := p[0], p[1]
164-
for _, dir := range dirs {
165-
x, y := i+dir[0], j+dir[1]
166-
if 0 <= x && x < m && 0 <= y && y < n && grid[x][y] > grid[i][j] && dist[x][y] < dist[i][j]+1 {
167-
dist[x][y] = dist[i][j] + 1
168-
ans = max(ans, dist[x][y])
169-
q = append(q, [2]int{x, y})
143+
for j := 0; j < n-1; j++ {
144+
t := map[int]bool{}
145+
for i := range q {
146+
for k := i - 1; k <= i+1; k++ {
147+
if k >= 0 && k < m && grid[i][j] < grid[k][j+1] {
148+
t[k] = true
149+
}
170150
}
171151
}
152+
if len(t) == 0 {
153+
return j
154+
}
155+
q = t
172156
}
173-
return
157+
return n - 1
158+
}
159+
```
160+
161+
```ts
162+
function maxMoves(grid: number[][]): number {
163+
const m = grid.length;
164+
const n = grid[0].length;
165+
let q = new Set<number>(Array.from({ length: m }, (_, i) => i));
166+
for (let j = 0; j < n - 1; ++j) {
167+
const t = new Set<number>();
168+
for (const i of q) {
169+
for (let k = i - 1; k <= i + 1; ++k) {
170+
if (k >= 0 && k < m && grid[i][j] < grid[k][j + 1]) {
171+
t.add(k);
172+
}
173+
}
174+
}
175+
if (t.size === 0) {
176+
return j;
177+
}
178+
q = t;
179+
}
180+
return n - 1;
174181
}
175182
```
176183

0 commit comments

Comments
 (0)