题目链接
题目描述
实现代码
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];
}
}