当前位置: 首页 > article >正文

LeetCode | 不同路径

一个机器人位于一个 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 * 109

思路

在过去,有这样一个词,那就是遇难则反,从起点推导出最小路径和是困难的,那我们就从终点去推导。

解题过程

我们都知道一个方块,只能向右或向下。在初始化dp之后,我们会有这样一条关系式:

d p [ i ] [ j ] = { 1 if  i = = m − 1   a n d   j = = n − 1 d p [ i + 1 ] [ j ] + d p [ i ] [ j + 1 ] if  i + 1 < m   a n d   j + 1 < n d p [ i + 1 ] [ j ] if  i + 1 < m d p [ i ] [ j + 1 ] if   j + 1 < n dp[i][j] = \left\{\begin{matrix} 1 &\text{if } i == m-1 \ and \ j == n-1 \\ dp[i+1][j] + dp[i][j+1]&\text{if } i+1 < m \ and \ j+1 < n \\ dp[i+1][j]&\text{if } i+1 < m \\ dp[i][j+1] &\text{if } \ j+1 < n \end{matrix} \right. dp[i][j]= 1dp[i+1][j]+dp[i][j+1]dp[i+1][j]dp[i][j+1]if i==m1 and j==n1if i+1<m and j+1<nif i+1<mif  j+1<n

复杂度

时间复杂度: O ( N ⋅ M ) O(N \cdot M) O(NM)
空间复杂度: O ( N ⋅ M ) O(N \cdot M) O(NM)

Code

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

http://www.kler.cn/a/521443.html

相关文章:

  • 如何在 ACP 中建模复合罐
  • 计算机网络之计算机网络的分类
  • C#,入门教程(13)——字符(char)及字符串(string)的基础知识
  • langchain基础(二)
  • CAPL与外部接口
  • 初二回娘家
  • Java:初识Java
  • 【由浅入深认识Maven】第4部分 maven在持续集成中的应用
  • Day41:列表的切片
  • pytorch 张量创建基础
  • 关于pygame窗口输入法状态异常切换现象的分析报告
  • 每日 Java 面试题分享【第 11 天】
  • SSM开发(四) spring+SpringMVC+mybatis整合(含完整运行demo源码)
  • PHP htmlspecialchars()函数详解
  • javascript-es6 (二)
  • 深度学习,python编程运行环境问题等记录(更新)
  • DistilBERT 是 BERT 的精简版本,具有更小、更快、更经济、更轻便的特点。
  • SD-WAN站点和客户端的区别
  • VS Code i18n国际化组件代码code显示中文配置 i18n ally
  • toRow和markRow的用法以及使用场景
  • K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观
  • 【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝
  • 深圳大学-智能网络与计算-实验三:网络容量优化分析实验
  • 【2024年华为OD机试】 (B卷,100分)- 阿里巴巴找黄金宝箱(III)(JavaScriptJava PythonC/C++)
  • 超硬核,基于mmap和零拷贝实现高效的内存共享
  • 计算机图形学知识点整理(期末复习/知识点学习/笔试/面试)