Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
You are given an m x n matrix maze (0-indexed) with empty cells (represented as '.') and walls (represented as '+'). You are also given the entrance of the maze, where entrance = [entrancerow, entrancecol] denotes the row and column of the cell you are initially standing at.
In one step, you can move one cell up, down, left, or right. You cannot step into a cell with a wall, and you cannot step outside the maze. Your goal is to find the nearest exit from the entrance. An exit is defined as an empty cell that is at the border of the maze. The entrance does not count as an exit.
Return the number of steps in the shortest path from the entrance to the nearest exit, or -1 if no such path exists.
Example 1:
Input: maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]], entrance = [1,2] Output: 1 Explanation: There are 3 exits in this maze at [1,0], [0,2], and [2,3]. Initially, you are at the entrance cell [1,2]. - You can reach [1,0] by moving 2 steps left. - You can reach [0,2] by moving 1 step up. It is impossible to reach [2,3] from the entrance. Thus, the nearest exit is [0,2], which is 1 step away.
Example 2:
Input: maze = [["+","+","+"],[".",".","."],["+","+","+"]], entrance = [1,0] Output: 2 Explanation: There is 1 exit in this maze at [1,2]. [1,0] does not count as an exit since it is the entrance cell. Initially, you are at the entrance cell [1,0]. - You can reach [1,2] by moving 2 steps right. Thus, the nearest exit is [1,2], which is 2 steps away.
Example 3:
Input: maze = [[".","+"]], entrance = [0,0] Output: -1 Explanation: There are no exits in this maze.
Constraints:
maze.length == mmaze[i].length == n1 <= m, n <= 100maze[i][j] is either '.' or '+'.entrance.length == 20 <= entrancerow < m0 <= entrancecol < nentrance will always be an empty cell.Problem summary: You are given an m x n matrix maze (0-indexed) with empty cells (represented as '.') and walls (represented as '+'). You are also given the entrance of the maze, where entrance = [entrancerow, entrancecol] denotes the row and column of the cell you are initially standing at. In one step, you can move one cell up, down, left, or right. You cannot step into a cell with a wall, and you cannot step outside the maze. Your goal is to find the nearest exit from the entrance. An exit is defined as an empty cell that is at the border of the maze. The entrance does not count as an exit. Return the number of steps in the shortest path from the entrance to the nearest exit, or -1 if no such path exists.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array
[["+","+",".","+"],[".",".",".","+"],["+","+","+","."]] [1,2]
[["+","+","+"],[".",".","."],["+","+","+"]] [1,0]
[[".","+"]] [0,0]
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1926: Nearest Exit from Entrance in Maze
class Solution {
public int nearestExit(char[][] maze, int[] entrance) {
int m = maze.length, n = maze[0].length;
final int[] dirs = {-1, 0, 1, 0, -1};
Deque<int[]> q = new ArrayDeque<>();
q.offer(entrance);
maze[entrance[0]][entrance[1]] = '+';
for (int ans = 1; !q.isEmpty(); ++ans) {
for (int k = q.size(); k > 0; --k) {
var p = q.poll();
for (int d = 0; d < 4; ++d) {
int x = p[0] + dirs[d], y = p[1] + dirs[d + 1];
if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.') {
if (x == 0 || x == m - 1 || y == 0 || y == n - 1) {
return ans;
}
maze[x][y] = '+';
q.offer(new int[] {x, y});
}
}
}
}
return -1;
}
}
// Accepted solution for LeetCode #1926: Nearest Exit from Entrance in Maze
func nearestExit(maze [][]byte, entrance []int) int {
m, n := len(maze), len(maze[0])
q := [][2]int{{entrance[0], entrance[1]}}
maze[entrance[0]][entrance[1]] = '+'
dirs := []int{-1, 0, 1, 0, -1}
for ans := 1; len(q) > 0; ans++ {
for k := len(q); k > 0; k-- {
p := q[0]
q = q[1:]
for l := 0; l < 4; l++ {
x, y := p[0]+dirs[l], p[1]+dirs[l+1]
if x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' {
if x == 0 || x == m-1 || y == 0 || y == n-1 {
return ans
}
q = append(q, [2]int{x, y})
maze[x][y] = '+'
}
}
}
}
return -1
}
# Accepted solution for LeetCode #1926: Nearest Exit from Entrance in Maze
class Solution:
def nearestExit(self, maze: List[List[str]], entrance: List[int]) -> int:
m, n = len(maze), len(maze[0])
i, j = entrance
q = deque([(i, j)])
maze[i][j] = "+"
ans = 0
while q:
ans += 1
for _ in range(len(q)):
i, j = q.popleft()
for a, b in [[0, -1], [0, 1], [-1, 0], [1, 0]]:
x, y = i + a, j + b
if 0 <= x < m and 0 <= y < n and maze[x][y] == ".":
if x == 0 or x == m - 1 or y == 0 or y == n - 1:
return ans
q.append((x, y))
maze[x][y] = "+"
return -1
// Accepted solution for LeetCode #1926: Nearest Exit from Entrance in Maze
/**
* [1926] Nearest Exit from Entrance in Maze
*
* You are given an m x n matrix maze (0-indexed) with empty cells (represented as '.') and walls (represented as '+'). You are also given the entrance of the maze, where entrance = [entrancerow, entrancecol] denotes the row and column of the cell you are initially standing at.
* In one step, you can move one cell up, down, left, or right. You cannot step into a cell with a wall, and you cannot step outside the maze. Your goal is to find the nearest exit from the entrance. An exit is defined as an empty cell that is at the border of the maze. The entrance does not count as an exit.
* Return the number of steps in the shortest path from the entrance to the nearest exit, or -1 if no such path exists.
*
* Example 1:
* <img alt="" src="https://assets.leetcode.com/uploads/2021/06/04/nearest1-grid.jpg" style="width: 333px; height: 253px;" />
* Input: maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]], entrance = [1,2]
* Output: 1
* Explanation: There are 3 exits in this maze at [1,0], [0,2], and [2,3].
* Initially, you are at the entrance cell [1,2].
* - You can reach [1,0] by moving 2 steps left.
* - You can reach [0,2] by moving 1 step up.
* It is impossible to reach [2,3] from the entrance.
* Thus, the nearest exit is [0,2], which is 1 step away.
*
* Example 2:
* <img alt="" src="https://assets.leetcode.com/uploads/2021/06/04/nearesr2-grid.jpg" style="width: 253px; height: 253px;" />
* Input: maze = [["+","+","+"],[".",".","."],["+","+","+"]], entrance = [1,0]
* Output: 2
* Explanation: There is 1 exit in this maze at [1,2].
* [1,0] does not count as an exit since it is the entrance cell.
* Initially, you are at the entrance cell [1,0].
* - You can reach [1,2] by moving 2 steps right.
* Thus, the nearest exit is [1,2], which is 2 steps away.
*
* Example 3:
* <img alt="" src="https://assets.leetcode.com/uploads/2021/06/04/nearest3-grid.jpg" style="width: 173px; height: 93px;" />
* Input: maze = [[".","+"]], entrance = [0,0]
* Output: -1
* Explanation: There are no exits in this maze.
*
*
* Constraints:
*
* maze.length == m
* maze[i].length == n
* 1 <= m, n <= 100
* maze[i][j] is either '.' or '+'.
* entrance.length == 2
* 0 <= entrancerow < m
* 0 <= entrancecol < n
* entrance will always be an empty cell.
*
*/
pub struct Solution {}
// problem: https://leetcode.com/problems/nearest-exit-from-entrance-in-maze/
// discuss: https://leetcode.com/problems/nearest-exit-from-entrance-in-maze/discuss/?currentPage=1&orderBy=most_votes&query=
// submission codes start here
impl Solution {
pub fn nearest_exit(maze: Vec<Vec<char>>, entrance: Vec<i32>) -> i32 {
0
}
}
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[ignore]
fn test_1926_example_1() {
let maze = vec![
vec!['+', '+', '.', '+'],
vec!['.', '.', '.', '+'],
vec!['+', '+', '+', '.'],
];
let entrance = vec![1, 2];
let result = 1;
assert_eq!(Solution::nearest_exit(maze, entrance), result);
}
#[test]
#[ignore]
fn test_1926_example_2() {
let maze = vec![
vec!['+', '+', '+'],
vec!['.', '.', '.'],
vec!['+', '+', '+'],
];
let entrance = vec![1, 0];
let result = 2;
assert_eq!(Solution::nearest_exit(maze, entrance), result);
}
#[test]
#[ignore]
fn test_1926_example_3() {
let maze = vec![vec!['.'], vec!['+']];
let entrance = vec![0, 0];
let result = -1;
assert_eq!(Solution::nearest_exit(maze, entrance), result);
}
}
// Accepted solution for LeetCode #1926: Nearest Exit from Entrance in Maze
function nearestExit(maze: string[][], entrance: number[]): number {
const dir = [0, 1, 0, -1, 0];
const q = [[...entrance, 0]];
maze[entrance[0]][entrance[1]] = '+';
for (const [i, j, ans] of q) {
for (let d = 0; d < 4; d++) {
const [x, y] = [i + dir[d], j + dir[d + 1]];
const v = maze[x]?.[y];
if (!v && ans) {
return ans;
}
if (v === '.') {
q.push([x, y, ans + 1]);
maze[x][y] = '+';
}
}
}
return -1;
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.