zoukankan      html  css  js  c++  java
  • [LeetCode] 62. 不同路径

    题目链接: https://leetcode-cn.com/problems/unique-paths/

    题目描述:

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    问总共有多少条不同的路径?

    例如,上图是一个7 x 3 的网格。有多少可能的路径?

    说明:mn 的值均不超过 100。

    示例:

    示例 1:

    输入: m = 3, n = 2
    输出: 3
    解释:
    从左上角开始,总共有 3 条路径可以到达右下角。
    1. 向右 -> 向右 -> 向下
    2. 向右 -> 向下 -> 向右
    3. 向下 -> 向右 -> 向右
    

    示例 2:

    输入: m = 7, n = 3
    输出: 28
    

    思路:

    思路一:排列组合

    因为机器到底右下角,向下几步,向右几步都是固定的,

    比如,m=3,n=2,我们只要向下1步,向右2步就一定能到达终点.

    所以有(C_{m+n-2}^{m-1})

    def uniquePaths(self, m: int, n: int) -> int:
            return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1))
    

    思路二:动态规划

    我们令dp[i][j]是到达i,j最少步数

    动态方程: dp[i][j] = dp[i-1][j] + dp[i][j-1]

    注意,对于第一行dp[0][j],或者第一列dp[i][0],由于都是在边界,所以只能为1

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

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


    优化:因为我们每次只需要dp[i-1][j],dp[i][j-1]

    所以我们只要记录这两个数,直接看代码吧!

    代码

    思路二:

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            dp = [[1]*n] + [[1]+[0] * (n-1) for _ in range(m-1)]
            #print(dp)
            for i in range(1, m):
                for j in range(1, n):
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
            return dp[-1][-1]
    

    java

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

    优化1: 空间复杂度(O(2n))

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            pre = [1] * n
            cur = [1] * n
            for i in range(1, m):
                for j in range(1, n):
                    cur[j] = pre[j] + cur[j-1]
                pre = cur[:]
            return pre[-1]
    

    java

    class Solution {
        public int uniquePaths(int m, int n) {
            int[] pre = new int[n];
            int[] cur = new int[n];
            Arrays.fill(pre, 1);
            Arrays.fill(cur,1);
            for (int i = 1; i < m;i++){
                for (int j = 1; j < n; j++){
                    cur[j] = cur[j-1] + pre[j];
                }
                pre = cur.clone();
            }
            return pre[n-1]; 
        }
    }
    

    优化2:空间复杂度(O(n))

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            cur = [1] * n
            for i in range(1, m):
                for j in range(1, n):
                    cur[j] += cur[j-1]
            return cur[-1]
    

    java

    class Solution {
        public int uniquePaths(int m, int n) {
            int[] cur = new int[n];
            Arrays.fill(cur,1);
            for (int i = 1; i < m;i++){
                for (int j = 1; j < n; j++){
                    cur[j] += cur[j-1] ;
                }
            }
            return cur[n-1];
        }
    }
    
  • 相关阅读:
    java8时间处理
    HttpServletRequest
    Elasticsearch简介
    springCloud-Alibaba--Sentinel
    Nacos集群部署:
    nginx安装配置
    hibernate 嵌套事务
    linux下cmake安装mysql 源码
    linux下中文乱码问题解决
    tomcat quartz 被触发两次
  • 原文地址:https://www.cnblogs.com/powercai/p/10912626.html
Copyright © 2011-2022 走看看