LeetCode 62. Unique Paths
2020-06-02 19:16:13 # leetcode # core problems

Problem

LeetCode 62. Unique Paths

1. 题目简述

一个机器人坐落在一个m x n的一个网格中,初始点在top-left,终点在bottom-right,机器人只能向右或者向下走,求问有多少种走法可以到达终点。

2. 算法思路

参考解法:花花酱LeetCode

也是一道经典老题目了,DP的代表问题之一。LeetCode 63. Unique Paths II

动态规划

我们定义dp[i][j]为从[0][0]到达当前点的所有可能的方式,由于只能向右或者向下走,所以有如下递推式:

$$dp[i][j] = dp[i - 1][j] + dp[i][j - 1]$$

base case就是dp[0]和dp[i][0],这两条边线的初始值都为1,只有一种走法。

时间复杂度:O(m * n)

空间复杂度:O(m * n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

class Solution {
// top-down
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
Arrays.fill(dp[i], -1);
dp[i][0] = 1;
}
Arrays.fill(dp[0], 1);

return helper(dp, m - 1, n - 1);
}

private int helper(int[][] dp, int m, int n) {
if (m < 0 || n < 0) {
return 0;
}
if (dp[m][n] != -1) {
return dp[m][n];
}

dp[m][n] = helper(dp, m, n - 1) + helper(dp, m - 1, n);

return dp[m][n];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

class Solution {
// bottom-up
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
Arrays.fill(dp[i], -1);
dp[i][0] = 1;
}
Arrays.fill(dp[0], 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];
}
}