题目
给你一个 m x n
的整数网格图 grid
,你可以从一个格子移动到 4
个方向相邻的任意一个格子。
请你返回在网格图中从 任意 格子出发,达到 任意 格子,且路径中的数字是 严格递增 的路径数目。由于答案可能会很大,请将结果对 10^9 + 7
取余 后返回。
如果两条路径中访问过的格子不是完全相同的,那么它们视为两条不同的路径。
示例 1:
输入:grid = [[1,1],[3,4]]
输出:8
解释:严格递增路径包括:
- 长度为 1 的路径:[1],[1],[3],[4] 。
- 长度为 2 的路径:[1 -> 3],[1 -> 4],[3 -> 4] 。
- 长度为 3 的路径:[1 -> 3 -> 4] 。
路径数目为 4 + 3 + 1 = 8 。
示例 2:
输入:grid = [[1],[2]]
输出:3
解释:严格递增路径包括:
- 长度为 1 的路径:[1],[2] 。
- 长度为 2 的路径:[1 -> 2] 。
路径数目为 2 + 1 = 3 。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 1000
1 <= m * n <= 10^5
-
解题方法
DFS + 哈希表
设定哈希表
chart[i][j]
表示从第(i, j)
个方格为起点能够形成的严格递增路径数目。通过 DFS 的方式搜索每个格子为起点的严格递增路径,并更新哈希表。
时间复杂度O(mn)
,空间复杂度O(mn)
。
C++代码: ```cpp class Solution { private: int m, n; int mod = 1E9+7;int dfs(vector
>& grid, vector >& hash, int x, int y) { // cout<<x<<" "<<y<<endl; if(hash[x][y]) return hash[x][y]; int result = 1; if(x>0 && grid[x-1][y]>grid[x][y]) result = (result + dfs(grid, hash, x-1, y)) % mod; if(y>0 && grid[x][y-1]>grid[x][y]) result = (result + dfs(grid, hash, x, y-1)) % mod; if(x<m-1 && grid[x+1][y]>grid[x][y]) result = (result + dfs(grid, hash, x+1, y)) % mod; if(y<n-1 && grid[x][y+1]>grid[x][y]) result = (result + dfs(grid, hash, x, y+1)) % mod; hash[x][y] = result; return result;
}
public:
int countPaths(vector