329.矩阵中的最长递增路径
链接:329.矩阵中的最长递增路径
难度:Hard
标签:深度优先搜索、广度优先搜索、图、拓扑排序、记忆化搜索、数组、动态规划、矩阵
简介:给定一个整数矩阵,找出最长递增路径的长度。
题解 1 - cpp
- 编辑时间:2021-12-30
- 执行用时:32ms
- 内存消耗:14.3MB
- 编程语言:cpp
- 解法介绍:记忆化 dfs。
class Solution {
   public:
    int dirs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    int dfs(int mmap[][200], vector<vector<int>>& matrix, int n, int m, int row,
            int col) {
        if (mmap[row][col]) return mmap[row][col];
        int num = matrix[row][col], ans = 1;
        for (int i = 0; i < 4; i++) {
            int nrow = row + dirs[i][0];
            int ncol = col + dirs[i][1];
            if (nrow < 0 || ncol < 0 || nrow >= n || ncol >= m ||
                matrix[nrow][ncol] <= num)
                continue;
            ans = max(ans, dfs(mmap, matrix, n, m, nrow, ncol) + 1);
        }
        return mmap[row][col] = ans;
    }
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int n = matrix.size(), m = matrix[0].size(), ans = 0, mmap[n][200];
        memset(mmap, 0, sizeof(int) * n * 200);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int tag = 1, num = matrix[i][j];
                for (int k = 0; k < 4; k++) {
                    int nrow = i + dirs[k][0];
                    int ncol = j + dirs[k][1];
                    if (nrow < 0 || ncol < 0 || nrow >= n || ncol >= m)
                        continue;
                    if (matrix[nrow][ncol] < num) {
                        tag = 0;
                        break;
                    }
                }
                if (tag) ans = max(ans, dfs(mmap, matrix, n, m, i, j));
            }
        }
        return ans;
    }
};
题解 2 - typescript
- 编辑时间:2020-07-26
- 执行用时:232ms
- 内存消耗:47.1MB
- 编程语言:typescript
- 解法介绍:记忆化遍历。
function longestIncreasingPath(matrix: number[][]): number {
  const rowLen = matrix.length;
  if (rowLen === 0) return 0;
  const colLen = matrix[0].length;
  const cache = new Map<string, number>();
  const format = (row: number, col: number) => `${row}:${col}`;
  let maxNum = 0;
  const setMax = (num: number) => (maxNum = Math.max(maxNum, num));
  for (let i = 0; i < rowLen; i++) for (let j = 0; j < colLen; j++) setMax(each(i, j));
  return maxNum;
  function each(row: number, col: number, set = new Set<string>()): number {
    const num = matrix[row][col];
    const name = format(row, col);
    if (cache.has(name)) return cache.get(name)!;
    set.add(name);
    let max = 1;
    const setMax = (num: number) => (max = Math.max(max, num));
    if (row !== rowLen - 1 && matrix[row + 1][col] > num && !set.has(format(row + 1, col))) {
      setMax(each(row + 1, col, set) + 1);
    }
    if (row !== 0 && matrix[row - 1][col] > num && !set.has(format(row - 1, col))) {
      max = setMax(each(row - 1, col, set) + 1);
    }
    if (col !== 0 && matrix[row][col - 1] > num && !set.has(format(row, col - 1))) {
      setMax(each(row, col - 1, set) + 1);
    }
    if (col !== colLen - 1 && matrix[row][col + 1] > num && !set.has(format(row, col + 1))) {
      setMax(each(row, col + 1, set) + 1);
    }
    set.delete(name);
    cache.set(name, max);
    return max;
  }
}