-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRottingOranges.java
More file actions
100 lines (91 loc) · 2.86 KB
/
Copy pathRottingOranges.java
File metadata and controls
100 lines (91 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Source : https://leetcode.com/problems/rotting-oranges/
// Author : cornprinicess
// Date : 2020-03-05
/*****************************************************************************************************
*
* In a given grid, each cell can have one of three values:
*
* the value 0 representing an empty cell;
* the value 1 representing a fresh orange;
* the value 2 representing a rotten orange.
*
* Every minute, any fresh orange that is adjacent (4-directionally) to a rotten orange becomes rotten.
*
* Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is
* impossible, return -1 instead.
*
* Example 1:
*
* Input: [[2,1,1],[1,1,0],[0,1,1]]
* Output: 4
*
* Example 2:
*
* Input: [[2,1,1],[0,1,1],[1,0,1]]
* Output: -1
* Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because
* rotting only happens 4-directionally.
*
* Example 3:
*
* Input: [[0,2]]
* Output: 0
* Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
*
* Note:
*
* 1 <= grid.length <= 10
* 1 <= grid[0].length <= 10
* grid[i][j] is only 0, 1, or 2.
*
******************************************************************************************************/
package RottingOranges;
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
public class RottingOranges {
private int[] dr = new int[]{-1, 0, 1, 0};
private int[] dc = new int[]{0, -1, 0, 1};
public int orangeRotting(int[][] grid) {
int R = grid.length;
int C = grid[0].length;
// queue: all starting cells with rotten oranges
Queue<Integer> queue = new ArrayDeque<>();
Map<Integer, Integer> depth = new HashMap<>();
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (grid[r][c] == 2) {
int code = r * C + c;
queue.add(code);
depth.put(code, 0);
}
}
}
int ans = 0;
while (!queue.isEmpty()) {
int code = queue.remove();
int r = code / C;
int c = code % C;
for (int k = 0; k < 4; k++) {
int nr = r + dr[k];
int nc = c + dc[k];
if (0 <= nr && nc < R && 0 <= nc && nc < C && grid[nr][nc] == 1) {
grid[nr][nc] = 2;
int ncode = nr * C + nc;
queue.add(ncode);
depth.put(ncode, depth.get(code) + 1);
ans = depth.get(ncode);
}
}
}
for (int[] row: grid) {
for(int v : row) {
if (v == 1) {
return - 1;
}
}
}
return ans;
}
}