[LeetCode] 329. 矩阵中的最长递增路径

[LeetCode] 329. 矩阵中的最长递增路径(DFS+MEMO)

难度:Hard

题目描述:

[LeetCode] 329. 矩阵中的最长递增路径_第1张图片

解题思路:

  • 用一个Memo记录当前memo[i][j]位置是多少最长路径
  • 对棋盘中的每个点进行DFS,当坐标不越界,并且判断的格子是递增的时候:
  • memo[x][y] = max(memo[x][y], dfs(matrix, newX, newY, memo) + 1)
class Solution {
     
public:
    int dx[4] = {
     -1, +1, 0, 0};
    int dy[4] = {
     0, 0, +1, -1};
    int row;
    int col;

    int longestIncreasingPath(vector<vector<int>>& matrix) {
     
        if (matrix.size() == 0 || matrix[0].size() == 0)
        {
     
            return 0;
        }
        
        row = matrix.size();
        col = matrix[0].size();

        auto memo = vector<vector<int>> (row, vector<int>(col));
        int ans = 0;

        for (int i = 0; i < row; i++)
        {
     
            for (int j = 0; j < col; j++)
            {
     
                ans = max(ans, dfs(matrix, i, j, memo));
            }
        }
        
        return ans;
    }

    int dfs(vector<vector<int>>& matrix, int x, int y, vector<vector<int>>& memo){
     
        // 防止重复递归
        if (memo[x][y] != 0)
        {
     
            return memo[x][y];
        }
        
        memo[x][y]++;

        // 深搜周围的格子
        for (int i = 0; i < 4; i++)
        {
     
            int newX = x + dx[i];
            int newY = y + dy[i];
            if (newX >= 0 && newX < row && newY >= 0 && newY < col && matrix[newX][newY] > matrix[x][y])
            {
     
                memo[x][y] = max(memo[x][y], dfs(matrix, newX, newY, memo) + 1);
            }
            
        }
        
        return memo[x][y];
    }
};

你可能感兴趣的:(LeetCode)