题目链接
题目描述
实现代码
dfs深度优先遍历思想,超时:
class Solution {int result = 0;public int uniquePaths(int m, int n) {dfs(1, 1, m, n);return result;}public void dfs(int i, int j, int m, int n) {if(i > m || j > n) {return;}if(i == m && j == n) {result++;return;}dfs(i+1, j, m, n);dfs(i, j+1, m, n);}}
动态规划思想:dp[i][j]记录从(1,1)到位置(i,j)的路径数,状态转移方程为:
dp[i][j] = dp[i-1][j] + dp[i][j-1];
初始化条件:
dp[1][j] = 1 j取任何数 dp[i][1] = 1 i取任何数
实现代码:
class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m+1][n+1];for(int i=1; i<=m; i++) {dp[i][1] = 1;}for(int j=1; j<=n; j++) {dp[1][j] = 1;}for(int i=2; i<=m; i++) {for(int j=2; j<=n; j++) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m][n];}}
在二维数组的基础上进行降维优化,实现代码如下:
class Solution {public static int uniquePaths(int m, int n) {int[] dp = new int[n];dp[0] = 1;for(int i = 0; i < m ; i++){for(int j = 1; j < n; j++){dp[j] = dp[j - 1] + dp[j];}}return dp[n - 1];}}
