【LeetCode-329】矩阵中的最长递增路径

问题

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

示例

输入: matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]。

解答

class Solution {
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        memo.assign(m, vector<int>(n));
        int res = 0;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                res = max(res, dfs(matrix, i, j));
        return res;
    }
private:
    vector<vector<int>> memo;
    int dx[4]{-1, 1, 0, 0};
    int dy[4]{0, 0, 1, -1};
    int dfs(vector<vector<int>>& matrix, int x, int y) {
        if (memo[x][y]) return memo[x][y];
        int ans = 1;
        for (int i = 0; i < 4; i++) {
            int nx = dx[i] + x, ny = dy[i] + y;
            if (nx < 0 || nx == matrix.size() || ny < 0 || ny == matrix[0].size()) continue; // 保证不出边界
            if (matrix[x][y] <= matrix[nx][ny]) continue; // 保证严格递增
            ans = max(ans, dfs(matrix, nx, ny) + 1);
        }
        return memo[x][y] = ans;
    }
};

重点思路

经典的DFS问题,需要注意的是要使用记忆化搜索,可以把时间复杂度降低到\(O(mn)\),m和n为矩形的长宽。

posted @ 2021-08-11 11:02  tmpUser  阅读(39)  评论(0编辑  收藏  举报