62. Unique Paths
Description
描述:https://leetcode.com/problems/unique-paths/description/
题意:m列 × n行 的网格,从左上角第一个到右下角最后一个(只能往右和下这两个方向走),有多少条不重复的路径
Solution 1: (Java) 超时
class Solution {
public int paths = 0;
public int uniquePaths(int m, int n) {
if (m == 1 && n == 1)
return 1;
backtracking(2, 1, m, n);
backtracking(1, 2, m, n);
return paths;
}
public void backtracking(int right, int down, int m, int n) {
if (right == m && down == n) {
paths++;
return;
}
if (right > m || down > n)
return;
backtracking(right + 1, down, m, n);
backtracking(right, down + 1, m, n);
}
}
思路1
- 刚开始想到的是回溯法,但是在 37/62 测试用例就超时了,得换思路了。
Solution 2: (Java)
class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[m];
Arrays.fill(dp, 1);
for (int i = 1; i < n; ++i) {
for (int j = 1; j < m; ++j) {
dp[j] += dp[j - 1];
}
}
return dp[m - 1];
}
}
思路2
- solution 2 思路是动态规划,runtime 0ms;
- 除了第一行和第一列(其中格子的到达路径都为1),到达其他格子的路径数目只与它上面的格子和左边的格子的路径数目有关,即状态转移方程:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
,这里用一维数组就可以完成。