2021-10-29 Daily-Challenge
Today I have done leetcode's October LeetCoding Challenge with cpp
.
October LeetCoding Challenge 29
Description
Rotting Oranges
You are given an m x n
grid
where each cell can have one of three values:
0
representing an empty cell,1
representing a fresh orange, or2
representing a rotten orange.
Every minute, any fresh orange that is 4-directionally adjacent 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
.
Example 1:
Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4
Example 2:
Input: grid = [[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: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j]
is0
,1
, or2
.
Solution
const int moves[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
queue<pair<int, int>> q;
int rows = grid.size();
int cols = grid.front().size();
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
if(grid[i][j] == 2) q.push({i, j});
}
}
while(q.size()) {
auto [row, col] = q.front();
q.pop();
for(int m = 0; m < 4; ++m) {
int newRow = row + moves[m][0];
int newCol = col + moves[m][1];
if(newRow < 0 || newRow >= rows || newCol >= cols || newCol < 0) continue;
if(grid[newRow][newCol] != 1) continue;
grid[newRow][newCol] = grid[row][col] + 1;
q.push({newRow, newCol});
}
}
int answer = 2;
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
if(grid[i][j] == 1) return -1;
answer = max(answer, grid[i][j]);
}
}
return answer - 2;
}
};
// Accepted
// 306/306 cases passed (4 ms)
// Your runtime beats 92.11 % of cpp submissions
// Your memory usage beats 50.83 % of cpp submissions (13.1 MB)