|
1 | 1 | package rotting_oranges
|
2 | 2 |
|
3 | 3 | func orangesRotting(grid [][]int) int {
|
4 |
| - r, c := len(grid), len(grid[0]) |
5 |
| - hasFresh, isRotten, rottens := false, false, make([]int, 0) |
| 4 | + r, c, minutes := len(grid), len(grid[0]), 0 |
| 5 | + freshCount, rottens := 0, make([]int, 0) |
6 | 6 | for i := 0; i < r; i++ {
|
7 | 7 | for j := 0; j < c; j++ {
|
8 |
| - if !hasFresh && grid[i][j] == 1 { |
9 |
| - hasFresh = true |
| 8 | + if grid[i][j] == 1 { |
| 9 | + freshCount++ |
10 | 10 | } else if grid[i][j] == 2 {
|
11 | 11 | rottens = append(rottens, i*c+j)
|
12 | 12 | }
|
13 | 13 | }
|
14 | 14 | }
|
15 |
| - for _, p := range rottens { |
16 |
| - i, j := p/c, p%c |
17 |
| - for k := 0; k < 4; k++ { |
18 |
| - nr, nc := i+k-1, j+k-2 |
19 |
| - if k == 0 { |
20 |
| - nc += 2 |
21 |
| - } else if k == 3 { |
22 |
| - nr -= 2 |
23 |
| - } |
24 |
| - if 0 <= nr && nr < r && 0 <= nc && nc < c && grid[nr][nc] == 1 { |
25 |
| - grid[nr][nc], isRotten = 2, true |
| 15 | + for len(rottens) > 0 && freshCount > 0 { |
| 16 | + l := len(rottens) |
| 17 | + for _, p := range rottens { |
| 18 | + for k := 0; k < 4; k++ { |
| 19 | + i, j := p/c+k-2, p%c+k-1 |
| 20 | + if k == 0 { |
| 21 | + i += 2 |
| 22 | + } else if k == 3 { |
| 23 | + j -= 2 |
| 24 | + } |
| 25 | + if 0 <= i && i < r && 0 <= j && j < c && grid[i][j] == 1 { |
| 26 | + grid[i][j], freshCount, rottens = 2, freshCount-1, append(rottens, i*c+j) |
| 27 | + } |
26 | 28 | }
|
27 | 29 | }
|
| 30 | + minutes, rottens = minutes+1, rottens[l:] |
28 | 31 | }
|
29 |
| - if !hasFresh { |
30 |
| - return 0 |
31 |
| - } else if !isRotten { |
32 |
| - return -1 |
33 |
| - } |
34 |
| - ans := orangesRotting(grid) |
35 |
| - if ans == -1 { |
| 32 | + if freshCount > 0 { |
36 | 33 | return -1
|
37 | 34 | }
|
38 |
| - return ans + 1 |
| 35 | + return minutes |
39 | 36 | }
|
0 commit comments