54
54
55
55
### 方法一:BFS
56
56
57
- 我们定义一个队列 $q$,初始时将第一列的所有单元格 $(i, 0)$ 加入队列,同时定义一个二维数组 $dist$,其中 $dist [ i ] [ j ] $ 表示到达单元格 $(i, j)$ 的最大移动次数。初始时,$dist [ i ] [ j ] = 0$ 。
57
+ 我们定义一个队列 $q$,初始时将第一列的所有行坐标加入队列中 。
58
58
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$,继续下一列的遍历 。
60
60
61
- 当队列为空时,我们就找到了矩阵中移动的最大次数, 返回 $ans$ 即可 。
61
+ 最后,如果我们遍历完了所有列,说明我们可以移动到最后一列, 返回 $n - 1$ 。
62
62
63
- 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n )$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
63
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
64
64
65
65
<!-- tabs:start -->
66
66
67
67
``` python
68
68
class Solution :
69
69
def maxMoves (self , grid : List[List[int ]]) -> int :
70
- dirs = ((- 1 , 1 ), (0 , 1 ), (1 , 1 ))
71
70
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
89
82
```
90
83
91
84
``` java
92
85
class Solution {
93
86
public int maxMoves (int [][] grid ) {
94
- int [][] dirs = {{- 1 , 1 }, {0 , 1 }, {1 , 1 }};
95
87
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
+ }
112
96
}
113
97
}
98
+ if (t. isEmpty()) {
99
+ return j;
100
+ }
101
+ q = t;
114
102
}
115
- return ans ;
103
+ return n - 1 ;
116
104
}
117
105
}
118
106
```
@@ -122,55 +110,74 @@ class Solution {
122
110
public:
123
111
int maxMoves(vector<vector<int >>& grid) {
124
112
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;
129
114
for (int i = 0; i < m; ++i) {
130
- q.emplace(i, 0 );
115
+ q.insert(i );
131
116
}
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
+ }
142
124
}
143
125
}
126
+ if (t.empty()) {
127
+ return j;
128
+ }
129
+ q.swap(t);
144
130
}
145
- return ans ;
131
+ return n - 1 ;
146
132
}
147
133
};
148
134
```
149
135
150
136
```go
151
137
func maxMoves(grid [][]int) (ans int) {
152
138
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
158
142
}
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
+ }
170
150
}
171
151
}
152
+ if len(t) == 0 {
153
+ return j
154
+ }
155
+ q = t
172
156
}
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 ;
174
181
}
175
182
```
176
183
0 commit comments