62. Unique Paths

Photo by Guilherme Stecanella on Unsplash
Photo by Guilherme Stecanella on Unsplash
This problem asks us to calculate the total number of all possible paths from the top-left corner to the bottom-right corner. We can observe that to go from the top-left corner to the bottom-right corner, the robot can only go right or down.

Problem

There is a robot on an m x n grid. The robot is initially located at the top-left corner (i.e., grid[0][0]). The robot tries to move to the bottom-right corner (i.e., grid[m - 1][n - 1]). The robot can only move either down or right at any point in time.

Given the two integers m and n, return the number of possible unique paths that the robot can take to reach the bottom-right corner.

The test cases are generated so that the answer will be less than or equal to 2 * 109.

Example 1:

Input: m = 3, n = 7
Output: 28

Example 2:

Input: m = 3, n = 2
Output: 3
Explanation: 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

Constraints:

  • 1 <= m, n <= 100

Solution

This problem asks us to calculate the total number of all possible paths from the top-left corner to the bottom-right corner. We can observe that to go from the top-left corner to the bottom-right corner, the robot can only go right or down. If the robot goes up or right, it is going back. This will cause the problem of duplicate paths.

Since the robot can only go right or down, when the robot is at A, it must have come from X or Y.

Therefore, the total number of paths to A is equal to the total number of paths to X plus the total number of paths to Y.

paths[i][j] = paths[i-1][j] + paths[i][j-1]

Dynamic Programming

  • Time: O(mn)
  • Space: O(mn)
class Solution {
    public int uniquePaths(int m, int n) {
        return uniquePaths(m - 1, n - 1, new int[m][n]);
    }

    private int uniquePaths(int m, int n, int[][] dp) {
        if (m == 0 && n == 0) return 1;
        if (dp[m][n] != 0) return dp[m][n];

        int paths = 0;
        if (m > 0) {
            paths += uniquePaths(m - 1, n, dp);
        }
        if (n > 0) {
            paths += uniquePaths(m, n - 1, dp);
        }

        dp[m][n] = paths;
        return paths;
    }
}

Reference

Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like
Photo by Oladimeji Odunsi on Unsplash
Read More

72. Edit Distance

When solving this problem, we must first observe how word1 becomes word2. Taking Example1 as an example, the lower left figure lists the distance from “horse” to “ros”.
Read More