这里的搜索算法指的是 DFS、BFS等常见的基础算法。

TODO: leetcode 迷宫II 迷宫III

DFS&BFS

记忆化搜索

记忆化搜索不像深度优先搜索那样重复枚举所有情况,而是把已经计算的子问题保存下来,所以说:记忆化搜索 = 深度优先搜索的实现 + 动态规划的思想

例1:矩阵中的最长递增路径

代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
    int n, m, path[202][202], res = 0;  // path[i][j] 表示 matrix[i][j] 位置的最长递增路径
    int d[5] = {-1, 0, 1, 0, -1};
    int dfs(int x, int y, vector<vector<int>>& matrix) {
        if (path[x][y] != 0) return path[x][y];  // 使用已经存储的数据
        
        path[x][y] = 1;  // 初始化为1
        for (int i = 0; i < 4; i++) {
            int nx = x + d[i], ny = y + d[i+1];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m && matrix[nx][ny] > matrix[x][y]) 
                path[x][y] = max(path[x][y], dfs(nx, ny, matrix) + 1);
        }
        return path[x][y];
    }
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        n = matrix.size(), m = matrix[0].size();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                res = max(res, dfs(i, j, matrix));
            }
        }
        return res;
    }
};

此外这道题也可以用动态规划的方法解决,参考:动态规划