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

    62. 不同路径

    Difficulty: 中等

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

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

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    示例 4:

    输入:m = 3, n = 3
    输出:6
    

    提示:

    • 1 <= m, n <= 100
    • 题目数据保证答案小于等于 2 * 10<sup>9</sup>

    Solution

    这是一道考察动态规划的题,解决动态规划的关键是如何将大的问题分解为小的子问题,在本题中令到达m,n网格的路径条数有f(m,n)条,因为机器人只能向下或者向右移动,那么到达m,n之前只可能在(m,n-1)(m-1,n)两个网格之间,那么可得f(m,n)=f(m,n-1)+f(m-1,n),即本题的动态转移方程。因此,我们可以从矩阵的(1,1)出发,向目标(m,n)递推逼近求解,时间复杂度为O(mn)

    最近几天做了几道动态规划的题目之后慢慢地发现解题的一些规律了。

    class Solution:
        def uniquePaths(self, m: int, n: int) -> int:
            paths = [[0] * (n+1) for _ in range(m+1)]
            if m < 0 or n < 0:
                return 0
            paths[1][1] = 1
            for i in range(1, m+1):
                for j in range(1, n+1):
                    if i == 1 and j == 1:
                        continue
                    else:
                        paths[i][j] = paths[i-1][j] + paths[i][j-1]
            return paths[m][n]
    

    参考:花花酱 LeetCode 62. Unique Paths - 刷题找工作 EP45 - YouTube

  • 相关阅读:
    list容器的sort函数
    c++ vector迭代器删除元素
    vs中属性页常用配置介绍2
    vs中属性页常用配置介绍
    error 不是类或命名空间
    实习代码编写中,一些有用的经验
    vs2015环境下生动动态链接库及使用
    STL容器使用的时机
    c++文件和流
    c++接口(抽象类,虚函数,纯虚函数)
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14584031.html
Copyright © 2011-2022 走看看