• [LeetCode] 62. Unique Paths 唯一路径


    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

    How many possible unique paths are there?


    Above is a 7 x 3 grid. How many possible unique paths are there?

    Note: m and n will be at most 100.

    Example 1:

    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 -> Right -> Down
    2. Right -> Down -> Right
    3. Down -> Right -> Right
    

    Example 2:

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

    解题思路:

    Climbing Stairs二维版。计算解个数的题多半是用DP。而这两题状态也非常显然,dp[i][j]表示从起点到位置(i, j)的路径总数。DP题目定义好状态后,接下去有两个任务:找通项公式,以及确定计算的方向。
    1. 由于只能向右和左走,所以对于(i, j)来说,只能从左边或上边的格子走下来:
    dp[i][j] = dp[i-1][j] + dp[i][j-1]
    2. 对于网格最上边和最左边,则只能从起点出发直线走到,dp[0][j] = dp[i][0] = 1
    3. 计算方向从上到下,从左到右即可。可以用滚动数组实现。
     
    Java Solution 1:
    class Solution {
        public int uniquePaths(int m, int n) {
            if (m == 0 || n == 0) {
                return 1;
            }
    
            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];
        }
    }
    

    Java Solution 2:

    class Solution {
        public int uniquePaths(int m, int n) {
            int[][] dp = new int[m][n];
            int i, j;
            for (i = 0; i < m; ++i) {
                for (j = 0; j < n; ++ j) {
                    if (i == 0 || j == 0) {
                        dp[i][j] = 1;
                    }
                    else {
                        dp[i][j] = dp[i-1][j] + dp[i][j-1];        
                    }
                }
            }
            return dp[m-1][n-1];
        }
    }
    

    CPP:

    class Solution {
    public:
        /**
         * @param n, m: positive integer (1 <= n ,m <= 100)
         * @return an integer
         */
        int uniquePaths(int m, int n) {
            // wirte your code here
            vector<vector<int> > f(m, vector<int>(n));
            
            for(int i = 0; i < n; i++)
                f[0][i] = 1;
                
            for(int i = 0; i < m; i++)
                f[i][0] = 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];
        }
    };
    

    Python:

    class Solution(object):
        def uniquePaths(self, m, n):
            dp = [[0] * n for i in xrange(m)]
            for i in xrange(m):
                for j in xrange(n):
                    if i == 0 or j == 0:
                        dp[i][j] = 1
                    else:
                        dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    
            return dp[m -1][n - 1]  

    Python: Time: O(m * n) Space: O(m + n)

    class Solution:
        # @return an integer
        def uniquePaths(self, m, n):
            if m < n:
                return self.uniquePaths(n, m)
            ways = [1] * n
    
            for i in xrange(1, m):
                for j in xrange(1, n):
                    ways[j] += ways[j - 1]
    
            return ways[n - 1] 

    Python:

    class Solution:
        # @return an integer
        def c(self, m, n):
            mp = {}
            for i in range(m):
                for j in range(n):
                    if(i == 0 or j == 0):
                        mp[(i, j)] = 1
                    else:
                        mp[(i, j)] = mp[(i - 1, j)] + mp[(i, j - 1)]
            return mp[(m - 1, n - 1)]
    
        def uniquePaths(self, m, n):
            return self.c(m, n)
    

    Python: wo

    class Solution(object):
        def uniquePaths(self, m, n):
            """
            :type m: int
            :type n: int
            :rtype: int
            """
            dp = [[0] * n for i in xrange(m)]   #  m, n不能反了        
            for i in xrange(m):
                for j in xrange(n):                    
                    if i == 0 and j == 0:
                        dp[i][j] = 1
                    elif i == 0:
                        dp[i][j] = dp[i][j-1]
                    elif j == 0:
                        dp[i][j] = dp[i-1][j]
                    else:    
                        dp[i][j] = dp[i-1][j] + dp[i][j-1]
                        
            return dp[-1][-1]                     

    JavaScript:

    /**
     * @param m: positive integer (1 <= m <= 100)
     * @param n: positive integer (1 <= n <= 100)
     * @return: An integer
     */
    const uniquePaths = function (m, n) {
        var f, i, j;
        f = new Array(m);
        for (i = 0; i < m; i++) f[i] = new Array(n);
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                if (i === 0 || j === 0) {
                    f[i][j] = 1;
                } else {
                    f[i][j] = f[i - 1][j] + f[i][j - 1];
                }
            }
        }
        return f[m - 1][n - 1];
    }
    

       

     

      

      

  • 相关阅读:
    求n的元素的最大最小值
    输出一个集合的所有子集,从长到短
    树的各种操作java
    几个笔试题目总结
    小知识不断补充
    java、C语言实现数组模拟栈
    LearnHowToThink
    Android中的this、Activity、Context等
    Android已上线应用开源分享中(第二季)
    Android已上线应用开源分享中(第一季)
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8469117.html
Copyright © 2020-2023  润新知