# [62. Unique Paths](https://leetcode.com/problems/unique-paths) [中文文档](/solution/0000-0099/0062.Unique%20Paths/README.md) ## Description <p>There is a robot on an <code>m x n</code> grid. The robot is initially located at the <strong>top-left corner</strong> (i.e., <code>grid[0][0]</code>). The robot tries to move to the <strong>bottom-right corner</strong> (i.e., <code>grid[m - 1][n - 1]</code>). The robot can only move either down or right at any point in time.</p> <p>Given the two integers <code>m</code> and <code>n</code>, return <em>the number of possible unique paths that the robot can take to reach the bottom-right corner</em>.</p> <p>The test cases are generated so that the answer will be less than or equal to <code>2 * 10<sup>9</sup></code>.</p> <p> </p> <p><strong class="example">Example 1:</strong></p> <img src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0062.Unique%20Paths/images/robot_maze.png" style="width: 400px; height: 183px;" /> <pre> <strong>Input:</strong> m = 3, n = 7 <strong>Output:</strong> 28 </pre> <p><strong class="example">Example 2:</strong></p> <pre> <strong>Input:</strong> m = 3, n = 2 <strong>Output:</strong> 3 <strong>Explanation:</strong> From the top-left corner, there are a total of 3 ways to reach the bottom-right corner: 1. Right -> Down -> Down 2. Down -> Down -> Right 3. Down -> Right -> Down </pre> <p> </p> <p><strong>Constraints:</strong></p> <ul> <li><code>1 <= m, n <= 100</code></li> </ul> ## Solutions Dynamic programming. <!-- tabs:start --> ### **Python3** ```python class Solution: def uniquePaths(self, m: int, n: int) -> int: f = [[0] * n for _ in range(m)] f[0][0] = 1 for i in range(m): for j in range(n): if i: f[i][j] += f[i - 1][j] if j: f[i][j] += f[i][j - 1] return f[-1][-1] ``` ```python class Solution: def uniquePaths(self, m: int, n: int) -> int: f = [[1] * n for _ in range(m)] for i in range(1, m): for j in range(1, n): f[i][j] = f[i - 1][j] + f[i][j - 1] return f[-1][-1] ``` ### **Java** ```java class Solution { public int uniquePaths(int m, int n) { var f = new int[m][n]; f[0][0] = 1; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (i > 0) { f[i][j] += f[i - 1][j]; } if (j > 0) { f[i][j] += f[i][j - 1]; } } } return f[m - 1][n - 1]; } } ``` ```java class Solution { public int uniquePaths(int m, int n) { var f = new int[m][n]; for (var g : f) { Arrays.fill(g, 1); } for (int i = 1; i < m; ++i) { for (int j = 1; j < n; j++) { f[i][j] = f[i - 1][j] + f[i][j - 1]; } } return f[m - 1][n - 1]; } } ``` ### **C++** ```cpp class Solution { public: int uniquePaths(int m, int n) { vector<vector<int>> f(m, vector<int>(n)); f[0][0] = 1; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (i) { f[i][j] += f[i - 1][j]; } if (j) { f[i][j] += f[i][j - 1]; } } } return f[m - 1][n - 1]; } }; ``` ```cpp class Solution { public: int uniquePaths(int m, int n) { vector<vector<int>> f(m, vector<int>(n, 1)); for (int i = 1; i < m; ++i) { for (int j = 1; j < n; ++j) { f[i][j] = f[i - 1][j] + f[i][j - 1]; } } return f[m - 1][n - 1]; } }; ``` ### **Go** ```go func uniquePaths(m int, n int) int { f := make([][]int, m) for i := range f { f[i] = make([]int, n) } f[0][0] = 1 for i := 0; i < m; i++ { for j := 0; j < n; j++ { if i > 0 { f[i][j] += f[i-1][j] } if j > 0 { f[i][j] += f[i][j-1] } } } return f[m-1][n-1] } ``` ```go func uniquePaths(m int, n int) int { f := make([][]int, m) for i := range f { f[i] = make([]int, n) for j := range f[i] { f[i][j] = 1 } } for i := 1; i < m; i++ { for j := 1; j < n; j++ { f[i][j] = f[i-1][j] + f[i][j-1] } } return f[m-1][n-1] } ``` ### **TypeScript** ```ts function uniquePaths(m: number, n: number): number { const f: number[][] = Array(m) .fill(0) .map(() => Array(n).fill(0)); f[0][0] = 1; for (let i = 0; i < m; ++i) { for (let j = 0; j < n; ++j) { if (i > 0) { f[i][j] += f[i - 1][j]; } if (j > 0) { f[i][j] += f[i][j - 1]; } } } return f[m - 1][n - 1]; } ``` ```ts function uniquePaths(m: number, n: number): number { const f: number[][] = Array(m) .fill(0) .map(() => Array(n).fill(1)); for (let i = 1; i < m; ++i) { for (let j = 1; j < n; ++j) { f[i][j] = f[i - 1][j] + f[i][j - 1]; } } return f[m - 1][n - 1]; } ``` ### **JavaScript** ```js /** * @param {number} m * @param {number} n * @return {number} */ var uniquePaths = function (m, n) { const f = Array(m) .fill(0) .map(() => Array(n).fill(0)); f[0][0] = 1; for (let i = 0; i < m; ++i) { for (let j = 0; j < n; ++j) { if (i > 0) { f[i][j] += f[i - 1][j]; } if (j > 0) { f[i][j] += f[i][j - 1]; } } } return f[m - 1][n - 1]; }; ``` ```js /** * @param {number} m * @param {number} n * @return {number} */ var uniquePaths = function (m, n) { const f = Array(m) .fill(0) .map(() => Array(n).fill(1)); for (let i = 1; i < m; ++i) { for (let j = 1; j < n; ++j) { f[i][j] = f[i - 1][j] + f[i][j - 1]; } } return f[m - 1][n - 1]; }; ``` ### **Rust** ```rust impl Solution { pub fn unique_paths(m: i32, n: i32) -> i32 { let (m, n) = (m as usize, n as usize); let mut dp = vec![1; n]; for i in 1..m { for j in 1..n { dp[j] += dp[j - 1]; } } dp[n - 1] } } ``` ### **...** ``` ``` <!-- tabs:end -->