该题解使用了回溯法来解决问题。首先,它定义了一个递归函数backtrack来尝试所有可能的路径,并使用一个局部变量vis_local来记录已经访问过的单元格,以避免重复访问。函数backtrack接受当前位置(x, y)和当前收集到的黄金总量count作为参数,它会尝试向四个方向探索,并在探索后回溯。此外,题解中还使用了一个函数find_corner来优化搜索过程,该函数用于判断一个单元格是否是一个'角落',即最多只与两个有黄金的单元格相邻。如果一个单元格是角落,则可以从该单元格开始搜索,这样可以减少不必要的搜索次数。
时间复杂度: O(4^(mn))
空间复杂度: O(mn)
class Solution:
def getMaximumGold(self, grid: List[List[int]]) -> int:
res = 0
b = set()
g_x, g_y = len(grid[0]), len(grid)
def backtrack(x, y, count, vis_local):
nonlocal res
if count > res:
res = count
for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
n_x, n_y = x + i, y + j
if 0 <= n_x < g_x and 0 <= n_y < g_y and vis_local[n_y][n_x] and grid[n_y][n_x]:
vis_local[n_y][n_x] = 0
backtrack(n_x, n_y, count + grid[n_y][n_x], vis_local)
vis_local[n_y][n_x] = 1
def find_corner(i, j):
count = 0
for x, y in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
n_x, n_y = x + i, y + j
if 0 <= n_x < g_x and 0 <= n_y < g_y and grid[n_y][n_x]:
count += 1
return count <= 2
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] and find_corner(j, i):
vis_local = [[1] * g_x for _ in range(g_y)]
vis_local[i][j] = 0
backtrack(j, i, grid[i][j], vis_local)
return res
# 作者:时雨
# 链接:https://leetcode.cn/problems/path-with-maximum-gold/solutions/1243095/ji-bai-100-python-hui-su-you-hua-by-driz-lpfv/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。