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.
In a gold mine grid of size m x n, each cell in this mine has an integer representing the amount of gold in that cell, 0 if it is empty.
Return the maximum amount of gold you can collect under the conditions:
0 gold.Example 1:
Input: grid = [[0,6,0],[5,8,7],[0,9,0]] Output: 24 Explanation: [[0,6,0], [5,8,7], [0,9,0]] Path to get the maximum gold, 9 -> 8 -> 7.
Example 2:
Input: grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]] Output: 28 Explanation: [[1,0,7], [2,0,6], [3,4,5], [0,3,0], [9,0,20]] Path to get the maximum gold, 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7.
Constraints:
m == grid.lengthn == grid[i].length1 <= m, n <= 150 <= grid[i][j] <= 100Problem summary: In a gold mine grid of size m x n, each cell in this mine has an integer representing the amount of gold in that cell, 0 if it is empty. Return the maximum amount of gold you can collect under the conditions: Every time you are located in a cell you will collect all the gold in that cell. From your position, you can walk one step to the left, right, up, or down. You can't visit the same cell more than once. Never visit a cell with 0 gold. You can start and stop collecting gold from any position in the grid that has some gold.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Backtracking
[[0,6,0],[5,8,7],[0,9,0]]
[[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1219: Path with Maximum Gold
class Solution {
private final int[] dirs = {-1, 0, 1, 0, -1};
private int[][] grid;
private int m;
private int n;
public int getMaximumGold(int[][] grid) {
m = grid.length;
n = grid[0].length;
this.grid = grid;
int ans = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
ans = Math.max(ans, dfs(i, j));
}
}
return ans;
}
private int dfs(int i, int j) {
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0) {
return 0;
}
int v = grid[i][j];
grid[i][j] = 0;
int ans = 0;
for (int k = 0; k < 4; ++k) {
ans = Math.max(ans, v + dfs(i + dirs[k], j + dirs[k + 1]));
}
grid[i][j] = v;
return ans;
}
}
// Accepted solution for LeetCode #1219: Path with Maximum Gold
func getMaximumGold(grid [][]int) (ans int) {
m, n := len(grid), len(grid[0])
var dfs func(i, j int) int
dfs = func(i, j int) int {
if i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == 0 {
return 0
}
v := grid[i][j]
grid[i][j] = 0
ans := 0
dirs := []int{-1, 0, 1, 0, -1}
for k := 0; k < 4; k++ {
ans = max(ans, v+dfs(i+dirs[k], j+dirs[k+1]))
}
grid[i][j] = v
return ans
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
ans = max(ans, dfs(i, j))
}
}
return
}
# Accepted solution for LeetCode #1219: Path with Maximum Gold
class Solution:
def getMaximumGold(self, grid: List[List[int]]) -> int:
def dfs(i: int, j: int) -> int:
if not (0 <= i < m and 0 <= j < n and grid[i][j]):
return 0
v = grid[i][j]
grid[i][j] = 0
ans = max(dfs(i + a, j + b) for a, b in pairwise(dirs)) + v
grid[i][j] = v
return ans
m, n = len(grid), len(grid[0])
dirs = (-1, 0, 1, 0, -1)
return max(dfs(i, j) for i in range(m) for j in range(n))
// Accepted solution for LeetCode #1219: Path with Maximum Gold
struct Solution;
impl Solution {
fn get_maximum_gold(mut grid: Vec<Vec<i32>>) -> i32 {
let n = grid.len();
let m = grid[0].len();
let mut sum = 0;
let mut res = 0;
for i in 0..n {
for j in 0..m {
Self::dfs(i, j, &mut sum, &mut res, &mut grid, n, m);
}
}
res
}
fn dfs(
i: usize,
j: usize,
sum: &mut i32,
max: &mut i32,
grid: &mut Vec<Vec<i32>>,
n: usize,
m: usize,
) {
if grid[i][j] == 0 {
return;
}
let val = grid[i][j];
*sum += val;
*max = (*max).max(*sum);
grid[i][j] = 0;
if i > 0 {
Self::dfs(i - 1, j, sum, max, grid, n, m);
}
if j > 0 {
Self::dfs(i, j - 1, sum, max, grid, n, m);
}
if i + 1 < n {
Self::dfs(i + 1, j, sum, max, grid, n, m);
}
if j + 1 < m {
Self::dfs(i, j + 1, sum, max, grid, n, m);
}
grid[i][j] = val;
*sum -= grid[i][j];
}
}
#[test]
fn test() {
let grid = vec_vec_i32![[0, 6, 0], [5, 8, 7], [0, 9, 0]];
let res = 24;
assert_eq!(Solution::get_maximum_gold(grid), res);
let grid = vec_vec_i32![[1, 0, 7], [2, 0, 6], [3, 4, 5], [0, 3, 0], [9, 0, 20]];
let res = 28;
assert_eq!(Solution::get_maximum_gold(grid), res);
}
// Accepted solution for LeetCode #1219: Path with Maximum Gold
function getMaximumGold(grid: number[][]): number {
const m = grid.length;
const n = grid[0].length;
const dfs = (i: number, j: number): number => {
if (i < 0 || i >= m || j < 0 || j >= n || !grid[i][j]) {
return 0;
}
const v = grid[i][j];
grid[i][j] = 0;
let ans = v + Math.max(dfs(i - 1, j), dfs(i + 1, j), dfs(i, j - 1), dfs(i, j + 1));
grid[i][j] = v;
return ans;
};
let ans = 0;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
ans = Math.max(ans, dfs(i, j));
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
Generate every possible combination without any filtering. At each of n positions we choose from up to n options, giving nⁿ total candidates. Each candidate takes O(n) to validate. No pruning means we waste time on clearly invalid partial solutions.
Backtracking explores a decision tree, but prunes branches that violate constraints early. Worst case is still factorial or exponential, but pruning dramatically reduces the constant factor in practice. Space is the recursion depth (usually O(n) for n-level decisions).
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.
Wrong move: Mutable state leaks between branches.
Usually fails on: Later branches inherit selections from earlier branches.
Fix: Always revert state changes immediately after recursive call.