题目:
题解一:DFS
从起始点左上角一直向右、向下搜索,如果搜索到右下角坐标,路径+1。
public int uniquePaths(int m, int n) {
return dfs(1, 1, m, n);
}
private int dfs(int i, int j, int m, int n) {
if (i > m || j > n) {
return 0;
}
if (i == m && j == n) {
return 1;
}
return dfs(i+1, j, m, n) + dfs(i, j+1, m, n);
}
时间复杂度:O()
题解二:动态规划
- 定义dp数组dp[i][j] : 表示从(0,0)出发到(i,j)有dp[i][j]条不同路径。
- 确定推导公式:dp[i][j] 只能从两个方向推导出来,即dp[i-1][j]和dp[i][j-1],所以dp[i][j] = dp[i-1][j] + dp[i][j-1]。
- 初始化:dp[i][0] 一定都是1,因为从(0,0)到dp[i][0]只有一条路,同理dp[0][j]也一定都是1。
public int uniquePaths(int m, int n) {
int [][] dp = new int[m][n];
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int i = 0; i < n; i++) dp[0][i] = 1;
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
return dp[m-1][n-1];
}
时间复杂度:O(m+n)