题解 | #矩阵最长递增路径#

矩阵最长递增路径

https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 递增路径的最大长度
     * @param matrix int整型vector<vector<>> 描述矩阵的每个数
     * @return int整型
     */
    vector<int> dx = {-1, 1, 0, 0};
    vector<int> dy = {0, 0, -1, 1};

    int solve(vector<vector<int> >& matrix) {//方法一,直接dfs
        // write code here
        int n = matrix.size();
        if (n == 0)return 0;
        int m = matrix[0].size();

        int maxPath = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                maxPath = max(maxPath, dfs1(matrix, i, j));
            }
        }

        return maxPath;
    }

    int dfs1(vector<vector<int>>& matrix, int x, int y) {
        int n = matrix.size();
        if (n == 0)return 0;
        int m = matrix[0].size();

        int maxPath = 1;
        for (int i = 0; i < 4; ++i) {
            int next_x = x + dx[i];
            int next_y = y + dy[i];

            if (next_x < 0 || next_x >= n || next_y < 0 || next_y >= m)
                continue;
            if (matrix[next_x][next_y] <= matrix[x][y])
                continue;

            maxPath = max(maxPath, 1 + dfs1(matrix, next_x, next_y));
        }

        return maxPath;
    }

    int solve2(vector<vector<int> >& matrix) {//方法二,动态规划+dfs
        int n = matrix.size();
        if (n == 0)return 0;
        int m = matrix[0].size();

        vector<vector<int>> dp(n, vector<int>(m));

        int maxPath = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                maxPath = max(maxPath, dfs2(matrix, dp, i, j));
            }
        }

        return maxPath;
    }

    int dfs2(vector<vector<int> >& matrix, vector<vector<int>>& dp, int x, int y) {
        int n = matrix.size();
        if (n == 0)return 0;
        int m = matrix[0].size();

        if (dp[x][y])
            return dp[x][y];

        dp[x][y] = 1;
        for (int i = 0; i < 4; ++i) {
            int next_x = x + dx[i];
            int next_y = y + dy[i];

            if (next_x < 0 || next_x >= n || next_y < 0 || next_y >= m)
                continue;
            if (matrix[next_x][next_y] <= matrix[x][y])
                continue;

            dp[x][y] = max(dp[x][y], 1 + dfs2(matrix, dp, next_x, next_y));
        }

        return dp[x][y];
    }


    int solve3(vector<vector<int>>& matrix) { //方法三,广度优先搜索
        int n = matrix.size();
        if (n == 0)return 0;
        int m = matrix[0].size();

        int maxPath = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j)
                maxPath = max(maxPath, bfsMaxLength(matrix, i, j));
        }
        return maxPath;
    }

    int bfsMaxLength(vector<vector<int>>& matrix, int x, int y) {
        int n = matrix.size();
        if (n == 0)return 0;
        int m = matrix[0].size();

        int temp = 0;

        queue<pair<int, int>> q;
        q.push({ x, y });
        while (!q.empty()) {
            temp++;
            int num = q.size();
            for (int k = 0; k < num; ++k) {
                pair<int, int> pos = q.front();
                q.pop();
                int x = pos.first, y = pos.second;
                for (int l = 0; l < 4; ++l) {
                    int next_x = x + dx[l];
                    int next_y = y + dy[l];
                    if (next_x >= 0 && next_x < n && next_y >= 0 && next_y < m &&
                            matrix[next_x][next_y] > matrix[x][y])
                        q.push({ next_x, next_y });
                }
            }
        }
        return temp;
    }

};

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务