Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 31797d1

Browse files
updates rotting oranges
1 parent 06be5bd commit 31797d1

File tree

1 file changed

+66
-59
lines changed

1 file changed

+66
-59
lines changed

β€Žsrc/RottingOranges.java

Lines changed: 66 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,97 @@
1-
import java.util.HashSet;
21
import java.util.LinkedList;
3-
import java.util.Objects;
42
import java.util.Queue;
5-
import java.util.Set;
63

74
public class RottingOranges {
8-
private static final int EMPTY_CELL = 0;
5+
private record RottenOrange(int row, int column, int time) {}
6+
97
private static final int FRESH_ORANGE = 1;
108
private static final int ROTTEN_ORANGE = 2;
119

12-
private static final class Orange {
13-
private final int row;
14-
private final int column;
15-
private final int minutes;
16-
17-
private Orange(int row, int column, int minutes) {
18-
this.row = row;
19-
this.column = column;
20-
this.minutes = minutes;
21-
}
10+
public int orangesRotting(int[][] grid) {
11+
final Queue<RottenOrange> queue = new LinkedList<>();
12+
addAllRottenOrangesToQueue(grid, queue);
13+
int elapsedTime = 0;
2214

23-
@Override
24-
public boolean equals(Object obj) {
25-
if (obj == this) return true;
26-
if (obj == null || obj.getClass() != this.getClass()) return false;
27-
var that = (Orange) obj;
28-
return this.row == that.row && this.column == that.column;
15+
while (!queue.isEmpty()) {
16+
RottenOrange orange = queue.poll();
17+
addAdjacentOrangesInQueue(orange, queue, grid);
18+
elapsedTime = Math.max(elapsedTime, orange.time);
2919
}
3020

31-
@Override
32-
public int hashCode() {
33-
return Objects.hash(row, column);
34-
}
21+
if (containsFreshOranges(grid)) return -1;
22+
return elapsedTime;
3523
}
3624

37-
public static int orangesRotting(int[][] grid) {
38-
final Queue<Orange> oranges = allRottingOranges(grid);
39-
final Set<Orange> visited = new HashSet<>();
40-
int result = 0;
41-
while (!oranges.isEmpty()) {
42-
Orange orange = oranges.poll();
43-
if (!isValidPosition(orange, grid) || visited.contains(orange) || isEmptyCell(grid, orange)) {
44-
continue;
25+
private void addAllRottenOrangesToQueue(int[][] grid, final Queue<RottenOrange> queue) {
26+
for (int row = 0 ; row < grid.length ; row++) {
27+
for (int column = 0 ; column < grid[0].length ; column++) {
28+
if (isRottenOrange(grid[row][column])) {
29+
queue.add(new RottenOrange(row, column, 0));
30+
}
4531
}
46-
visited.add(orange);
47-
grid[orange.row][orange.column] = ROTTEN_ORANGE;
48-
oranges.add(new Orange(orange.row - 1, orange.column, orange.minutes + 1));
49-
oranges.add(new Orange(orange.row, orange.column + 1, orange.minutes + 1));
50-
oranges.add(new Orange(orange.row + 1, orange.column, orange.minutes + 1));
51-
oranges.add(new Orange(orange.row, orange.column - 1, orange.minutes + 1));
52-
result = Math.max(result, orange.minutes);
5332
}
54-
if (allAreRotten(grid)) return result;
55-
return -1;
5633
}
5734

58-
private static boolean allAreRotten(int[][] grid) {
35+
private boolean isRottenOrange(int orange) {
36+
return orange == ROTTEN_ORANGE;
37+
}
38+
39+
private boolean isFreshOrange(int orange) {
40+
return orange == FRESH_ORANGE;
41+
}
42+
43+
private boolean containsFreshOranges(int[][] grid) {
5944
for (int[] row : grid) {
6045
for (int orange : row) {
61-
if (orange == FRESH_ORANGE) return false;
46+
if (isFreshOrange(orange)) return true;
6247
}
6348
}
64-
return true;
49+
return false;
6550
}
6651

67-
private static Queue<Orange> allRottingOranges(int[][] grid) {
68-
final Queue<Orange> rottenOranges = new LinkedList<>();
69-
for (int row = 0 ; row < grid.length ; row++) {
70-
for (int column = 0 ; column < grid[0].length ; column++) {
71-
if (grid[row][column] == ROTTEN_ORANGE) {
72-
rottenOranges.add(new Orange(row, column, 0));
73-
}
74-
}
52+
private void addAdjacentOrangesInQueue(RottenOrange orange, Queue<RottenOrange> queue, int[][] grid) {
53+
addOrangeOnTop(orange, queue, grid);
54+
addOrangeOnRight(orange, queue, grid);
55+
addOrangeOnBottom(orange, queue, grid);
56+
addOrangeOnLeft(orange, queue, grid);
57+
}
58+
59+
private void addOrangeOnTop(RottenOrange orange, Queue<RottenOrange> queue, int[][] grid) {
60+
if (isValidPosition(grid, orange.row - 1, orange.column) && isFreshOrange(grid[orange.row - 1][orange.column])) {
61+
markRotten(grid, orange.row - 1, orange.column);
62+
queue.add(new RottenOrange(orange.row - 1, orange.column, orange.time + 1));
63+
}
64+
}
65+
66+
private void addOrangeOnRight(RottenOrange orange, Queue<RottenOrange> queue, int[][] grid) {
67+
if (isValidPosition(grid, orange.row, orange.column + 1) && isFreshOrange(grid[orange.row][orange.column + 1])) {
68+
markRotten(grid, orange.row, orange.column + 1);
69+
queue.add(new RottenOrange(orange.row, orange.column + 1, orange.time + 1));
70+
}
71+
}
72+
73+
private void addOrangeOnBottom(RottenOrange orange, Queue<RottenOrange> queue, int[][] grid) {
74+
if (isValidPosition(grid, orange.row + 1, orange.column) && isFreshOrange(grid[orange.row + 1][orange.column])) {
75+
markRotten(grid, orange.row + 1, orange.column);
76+
queue.add(new RottenOrange(orange.row + 1, orange.column, orange.time + 1));
7577
}
76-
return rottenOranges;
7778
}
7879

79-
private static boolean isValidPosition(Orange orange, int[][] grid) {
80-
return orange.row >= 0 && orange.row < grid.length && orange.column >= 0 && orange.column < grid[0].length;
80+
private void addOrangeOnLeft(RottenOrange orange, Queue<RottenOrange> queue, int[][] grid) {
81+
if (isValidPosition(grid, orange.row, orange.column - 1) && isFreshOrange(grid[orange.row][orange.column - 1])) {
82+
markRotten(grid, orange.row, orange.column - 1);
83+
queue.add(new RottenOrange(orange.row, orange.column - 1, orange.time + 1));
84+
}
8185
}
8286

83-
private static boolean isRotten(int[][] grid, Orange orange) {
84-
return grid[orange.row][orange.column] == ROTTEN_ORANGE;
87+
private boolean isValidPosition(int[][] grid, int row, int column) {
88+
return row >= 0
89+
&& row < grid.length
90+
&& column >= 0
91+
&& column < grid[0].length;
8592
}
8693

87-
private staticbooleanisEmptyCell(int[][] grid, Orangeorange) {
88-
returngrid[orange.row][orange.column] == EMPTY_CELL;
94+
private voidmarkRotten(int[][] grid, introw, intcolumn) {
95+
grid[row][column] =ROTTEN_ORANGE;
8996
}
9097
}

0 commit comments

Comments
(0)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /