Find the Safest Path in a Grid
Solution
class Solution:
# Directions for moving to neighboring cells: right, left, down, up
dir = [(0, 1), (0, -1), (1, 0), (-1, 0)]
def maximumSafenessFactor(self, grid: List[List[int]]) -> int:
n = len(grid)
multi_source_queue = deque()
# Mark thieves as 0 and empty cells as -1, and push thieves to the queue
for i in range(n):
for j in range(n):
if grid[i][j] == 1:
# Push thief coordinates to the queue
multi_source_queue.append((i, j))
# Mark thief cell with 0
grid[i][j] = 0
else:
# Mark empty cell with -1
grid[i][j] = -1
# Calculate safeness factor for each cell using BFS
while multi_source_queue:
size = len(multi_source_queue)
while size > 0:
curr = multi_source_queue.popleft()
# Check neighboring cells
for d in self.dir:
di, dj = curr[0] + d[0], curr[1] + d[1]
val = grid[curr[0]][curr[1]]
# Check if the neighboring cell is valid and unvisited
if self.isValidCell(grid, di, dj) and grid[di][dj] == -1:
# Update safeness factor and push to the queue
grid[di][dj] = val + 1
multi_source_queue.append((di, dj))
size -= 1
# Binary search for maximum safeness factor
start, end, res = 0, 0, -1
for i in range(n):
for j in range(n):
# Set end as the maximum safeness factor possible
end = max(end, grid[i][j])
while start <= end:
mid = start + (end - start) // 2
if self.isValidSafeness(grid, mid):
# Store valid safeness and search for larger ones
res = mid
start = mid + 1
else:
end = mid - 1
return resTime Complexity
O(N squared log N)
Space Complexity
O(N squared)

