Leetcode 994. Rotten oranges

994. Rotten oranges

Result

Runtime: 7ms, 26.64% Memory: 17.82MB, 45.13%

from collections import deque

class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        rows, columns = len(grid), len(grid[0])
        directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        queue = deque()
        fresh = 0
        minutes = 0
        visited = set()
        for row in range(len(grid)):
            for column in range(len(grid[0])):
                if grid[row][column] == 2:
                    queue.append((row, column))
                if grid[row][column] == 1:
                    fresh += 1

        while queue:
            for cell in range(len(queue)):
                head = queue.popleft()
                row = head[0]
                column = head[1]
                visited.add((row, column))
                if grid[row][column] == 2:
                    for dx, dy in directions:
                        nr = row + dx
                        nc = column + dy
                        if nr < 0 or nr >= rows:
                            continue
                        if nc < 0 or nc >= columns:
                            continue
                        if (nr, nc) in visited:
                            continue
                        if grid[nr][nc] == 1:
                            grid[nr][nc] = 2
                            fresh = fresh -1
                            queue.append((nr, nc))
            # if we added something or while above uses fresh > 0
            if queue: 
                minutes = minutes + 1
        if fresh == 0:
            return minutes
        return -1
    Clicky