@@ -92,16 +92,16 @@ tags:
92
92
class Solution :
93
93
def orangesRotting (self , grid : List[List[int ]]) -> int :
94
94
m, n = len (grid), len (grid[0 ])
95
- q = deque()
96
95
cnt = 0
96
+ q = deque()
97
97
for i, row in enumerate (grid):
98
98
for j, x in enumerate (row):
99
- if x == 1 :
100
- cnt += 1
101
- elif x == 2 :
99
+ if x == 2 :
102
100
q.append((i, j))
103
- dirs = (- 1 , 0 , 1 , 0 , - 1 )
101
+ elif x == 1 :
102
+ cnt += 1
104
103
ans = 0
104
+ dirs = (- 1 , 0 , 1 , 0 , - 1 )
105
105
while q and cnt:
106
106
ans += 1
107
107
for _ in range (len (q)):
@@ -112,7 +112,9 @@ class Solution:
112
112
grid[x][y] = 2
113
113
q.append((x, y))
114
114
cnt -= 1
115
- return - 1 if cnt > 0 else ans
115
+ if cnt == 0 :
116
+ return ans
117
+ return - 1 if cnt else 0
116
118
```
117
119
118
120
#### Java
@@ -133,21 +135,22 @@ class Solution {
133
135
}
134
136
}
135
137
final int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
136
- int ans = 0 ;
137
- for (; ! q. isEmpty() && cnt > 0 ; ++ ans) {
138
+ for (int ans = 1 ; ! q. isEmpty() && cnt > 0 ; ++ ans) {
138
139
for (int k = q. size(); k > 0 ; -- k) {
139
140
var p = q. poll();
140
141
for (int d = 0 ; d < 4 ; ++ d) {
141
142
int x = p[0 ] + dirs[d], y = p[1 ] + dirs[d + 1 ];
142
143
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 ) {
143
144
grid[x][y] = 2 ;
144
145
q. offer(new int [] {x, y});
145
- -- cnt;
146
+ if (-- cnt == 0 ) {
147
+ return ans;
148
+ }
146
149
}
147
150
}
148
151
}
149
152
}
150
- return cnt > 0 ? - 1 : ans ;
153
+ return cnt > 0 ? - 1 : 0 ;
151
154
}
152
155
}
153
156
```
@@ -170,9 +173,8 @@ public:
170
173
}
171
174
}
172
175
}
173
- int ans = 0;
174
176
const int dirs[ 5] = {-1, 0, 1, 0, -1};
175
- for (; q.size() && cnt; ++ans) {
177
+ for (int ans = 1 ; q.size() && cnt; ++ans) {
176
178
for (int k = q.size(); k; --k) {
177
179
auto [ i, j] = q.front();
178
180
q.pop();
@@ -181,20 +183,22 @@ public:
181
183
if (x >= 0 && x < m && y >= 0 && y < n && grid[ x] [ y ] == 1) {
182
184
grid[ x] [ y ] = 2;
183
185
q.emplace(x, y);
184
- --cnt;
186
+ if (--cnt == 0) {
187
+ return ans;
188
+ }
185
189
}
186
190
}
187
191
}
188
192
}
189
- return cnt > 0 ? -1 : ans ;
193
+ return cnt > 0 ? -1 : 0 ;
190
194
}
191
195
};
192
196
```
193
197
194
198
#### Go
195
199
196
200
```go
197
- func orangesRotting(grid [][]int) (ans int) {
201
+ func orangesRotting(grid [][]int) int {
198
202
m, n := len(grid), len(grid[0])
199
203
q := [][2]int{}
200
204
cnt := 0
@@ -208,7 +212,7 @@ func orangesRotting(grid [][]int) (ans int) {
208
212
}
209
213
}
210
214
dirs := [5]int{-1, 0, 1, 0, -1}
211
- for ; len(q) > 0 && cnt > 0; ans++ {
215
+ for ans := 1 ; len(q) > 0 && cnt > 0; ans++ {
212
216
for k := len(q); k > 0; k-- {
213
217
p := q[0]
214
218
q = q[1:]
@@ -217,15 +221,17 @@ func orangesRotting(grid [][]int) (ans int) {
217
221
if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 {
218
222
grid[x][y] = 2
219
223
q = append(q, [2]int{x, y})
220
- cnt--
224
+ if cnt--; cnt == 0 {
225
+ return ans
226
+ }
221
227
}
222
228
}
223
229
}
224
230
}
225
231
if cnt > 0 {
226
232
return -1
227
233
}
228
- return
234
+ return 0
229
235
}
230
236
```
231
237
@@ -246,23 +252,24 @@ function orangesRotting(grid: number[][]): number {
246
252
}
247
253
}
248
254
}
249
- let ans: number = 0 ;
250
255
const dirs: number [] = [- 1 , 0 , 1 , 0 , - 1 ];
251
- for (; q .length && cnt ; ++ ans ) {
256
+ for (let ans = 1 ; q .length && cnt ; ++ ans ) {
252
257
const t: number [][] = [];
253
258
for (const [i, j] of q ) {
254
259
for (let d = 0 ; d < 4 ; ++ d ) {
255
260
const [x, y] = [i + dirs [d ], j + dirs [d + 1 ]];
256
261
if (x >= 0 && x < m && y >= 0 && y < n && grid [x ][y ] === 1 ) {
257
262
grid [x ][y ] = 2 ;
258
263
t .push ([x , y ]);
259
- cnt -- ;
264
+ if (-- cnt === 0 ) {
265
+ return ans ;
266
+ }
260
267
}
261
268
}
262
269
}
263
270
q .splice (0 , q .length , ... t );
264
271
}
265
- return cnt > 0 ? - 1 : ans ;
272
+ return cnt > 0 ? - 1 : 0 ;
266
273
}
267
274
```
268
275
@@ -277,51 +284,96 @@ impl Solution {
277
284
let n = grid [0 ]. len ();
278
285
let mut q = VecDeque :: new ();
279
286
let mut cnt = 0 ;
280
-
281
287
for i in 0 .. m {
282
288
for j in 0 .. n {
283
289
if grid [i ][j ] == 1 {
284
290
cnt += 1 ;
285
291
} else if grid [i ][j ] == 2 {
286
- q . push_back (vec! [ i as i32 , j as i32 ] );
292
+ q . push_back (( i , j ) );
287
293
}
288
294
}
289
295
}
290
296
291
- let dirs : [i32 ; 5 ] = [- 1 , 0 , 1 , 0 , - 1 ];
292
- let mut ans = 0 ;
293
-
294
- while ! q . is_empty () && cnt > 0 {
295
- let q_size = q . len ();
296
- for _ in 0 .. q_size {
297
- let p = q . pop_front (). unwrap ();
297
+ let dirs = [- 1 , 0 , 1 , 0 , - 1 ];
298
+ for ans in 1 .. {
299
+ if q . is_empty () || cnt == 0 {
300
+ break ;
301
+ }
302
+ let mut size = q . len ();
303
+ for _ in 0 .. size {
304
+ let (x , y ) = q . pop_front (). unwrap ();
298
305
for d in 0 .. 4 {
299
- let x = p [0 ] + dirs [d ];
300
- let y = p [1 ] + dirs [d + 1 ];
301
- if x >= 0
302
- && x < (m as i32 )
303
- && y >= 0
304
- && y < (n as i32 )
305
- && grid [x as usize ][y as usize ] == 1
306
- {
307
- grid [x as usize ][y as usize ] = 2 ;
308
- q . push_back (vec! [x , y ]);
309
- cnt -= 1 ;
306
+ let nx = x as isize + dirs [d ] as isize ;
307
+ let ny = y as isize + dirs [d + 1 ] as isize ;
308
+ if nx >= 0 && nx < m as isize && ny >= 0 && ny < n as isize {
309
+ let nx = nx as usize ;
310
+ let ny = ny as usize ;
311
+ if grid [nx ][ny ] == 1 {
312
+ grid [nx ][ny ] = 2 ;
313
+ q . push_back ((nx , ny ));
314
+ cnt -= 1 ;
315
+ if cnt == 0 {
316
+ return ans ;
317
+ }
318
+ }
310
319
}
311
320
}
312
321
}
313
- ans += 1 ;
314
322
}
315
-
316
323
if cnt > 0 {
317
- return - 1 ;
324
+ - 1
325
+ } else {
326
+ 0
318
327
}
319
-
320
- ans
321
328
}
322
329
}
323
330
```
324
331
332
+ #### JavaScript
333
+
334
+ ``` js
335
+ /**
336
+ * @param {number[][]} grid
337
+ * @return {number}
338
+ */
339
+ var orangesRotting = function (grid ) {
340
+ const m = grid .length ;
341
+ const n = grid[0 ].length ;
342
+ let q = [];
343
+ let cnt = 0 ;
344
+ for (let i = 0 ; i < m; ++ i) {
345
+ for (let j = 0 ; j < n; ++ j) {
346
+ if (grid[i][j] === 1 ) {
347
+ cnt++ ;
348
+ } else if (grid[i][j] === 2 ) {
349
+ q .push ([i, j]);
350
+ }
351
+ }
352
+ }
353
+
354
+ const dirs = [- 1 , 0 , 1 , 0 , - 1 ];
355
+ for (let ans = 1 ; q .length && cnt; ++ ans) {
356
+ let t = [];
357
+ for (const [i , j ] of q) {
358
+ for (let d = 0 ; d < 4 ; ++ d) {
359
+ const x = i + dirs[d];
360
+ const y = j + dirs[d + 1 ];
361
+ if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] === 1 ) {
362
+ grid[x][y] = 2 ;
363
+ t .push ([x, y]);
364
+ if (-- cnt === 0 ) {
365
+ return ans;
366
+ }
367
+ }
368
+ }
369
+ }
370
+ q = [... t];
371
+ }
372
+
373
+ return cnt > 0 ? - 1 : 0 ;
374
+ };
375
+ ```
376
+
325
377
<!-- tabs: end -->
326
378
327
379
<!-- solution: end -->
0 commit comments