【LeetCode 热题 100】62. 不同路径——(解法二)递推

Problem: 62. 不同路径

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(m * n)
    • 空间复杂度:O(m * n)

整体思路

这段代码同样旨在解决 “不同路径” 问题,但它采用的是一种 自底向上(Bottom-Up)的动态规划 方法,也称为 迭代法制表法 (Tabulation)。这种方法通过构建一个DP表(dp 二维数组),从起点开始,逐步计算出到达每个格子的路径数,最终得到终点的答案。

该实现通过巧妙地增加DP数组的维度(使用 m+1n+1),将边界条件的处理融入到统一的状态转移方程中,使得代码非常简洁。

  1. 状态定义与索引映射

    • 算法定义了一个二维DP数组 dp,大小为 (m+1) x (n+1)
    • dp[i][j] 的含义是:从起点 (1, 1)(对应 nums[0][0])到达网格中的点 (i, j) 的不同路径数
    • 这是一个索引偏移的技巧。dp 数组的索引 (i, j) 对应了 m x n 网格中的索引 (i-1, j-1)。这样做的好处是,dp 数组的第0行和第0列可以作为天然的边界,避免了在循环中进行 i>0j>0 的判断。
  2. 基础情况 (Base Case)

    • dp[1][1] = 1:这是整个DP计算的起点。它表示从起点到达起点 (1,1)(即 grid[0][0])只有1条路径(原地不动)。
    • dp 数组的其他元素默认初始化为 0。dp 的第0行和第0列全为0,这恰好满足我们的边界条件:无法从网格外部进入,路径数为0。
  3. 状态转移 (State Transition)

    • 算法使用两层嵌套循环来填充DP表。循环变量 ij 对应的是 m x n 网格的索引。
    • 在循环的每一步,计算 dp[i+1][j+1] 的值。
    • 状态转移方程是 dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j + 1]
    • 我们来解析这个方程:
      • 要到达 dp 中的点 (i+1, j+1)(对应 grid[i][j]),只能从其左边的点 (i+1, j)(对应 grid[i][j-1])或上边的点 (i, j+1)(对应 grid[i-1][j])过来。
      • 因此,到达 (i+1, j+1) 的总路径数,就是到达这两个点的路径数之和。
      • i=0j=0 时,例如计算 dp[1][j+1],方程变为 dp[1][j+1] = dp[1][j] + dp[0][j+1]。因为 dp[0][j+1] 总是0,所以 dp[1][j+1] = dp[1][j],这正确地表示了第一行所有格子的路径数都为1。对第一列同理。
  4. 返回结果

    • 当所有循环结束后,dp 数组已经完全填充。我们需要的最终答案,即到达终点 grid[m-1][n-1] 的路径数,就存储在 dp[m][n] 中。

完整代码

class Solution {/*** 计算从 m x n 网格的左上角到右下角的不同路径数。* @param m 网格的行数* @param n 网格的列数* @return 不同的路径总数*/public int uniquePaths(int m, int n) {// dp: 动态规划数组。dp[i][j] 表示从起点到网格 (i-1, j-1) 的路径数。// 使用 m+1, n+1 的大小是为了用第0行和第0列作为边界,简化代码。int[][] dp = new int[m + 1][n + 1];// 基础情况:到达起点 (0,0) 的路径数是 1。// 在我们的 dp 表中,这对应 dp[1][1]。dp[1][1] = 1;// i 和 j 是原始网格的索引 (0-based)for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 跳过我们已经设置的起点if (i == 0 && j == 0)continue;// 状态转移方程:// 到达网格 (i, j) 的路径数,等于到达其上方格子 (i-1, j)// 和左方格子 (i, j-1) 的路径数之和。// 在 dp 表中,这对应于:// dp[i+1][j+1] = dp[i][j+1] + dp[i+1][j]dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j + 1];}}// 最终答案是到达网格 (m-1, n-1) 的路径数,对应 dp[m][n]。return dp[m][n];}
}

时空复杂度

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

  1. 循环结构:算法使用了两层嵌套的 for 循环。
    • 外层循环从 i = 0 运行到 m-1,执行 m 次。
    • 内层循环从 j = 0 运行到 n-1,执行 n 次。
  2. 计算依据
    • 总的操作次数(主要是加法和赋值)是内外层循环次数的乘积,即 m * n

综合分析
算法的时间复杂度为 O(m * n)

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

  1. 主要存储开销:算法创建了一个名为 dp 的二维整型数组来存储动态规划的所有中间状态。
  2. 空间大小:该数组的大小是 (m + 1) * (n + 1)

综合分析
算法所需的额外空间主要由 dp 数组决定,其空间复杂度为 O(m * n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95038.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 高阶错误解析:MSVC 与 Qt 全景指南

在 C 开发中&#xff0c;尤其是在 Windows 平台使用 MSVC 或 Qt 框架 时&#xff0c;程序员经常会遇到编译错误、链接错误和运行时异常。本文将系统梳理这些问题&#xff0c;按 语法错误、类型错误、链接错误、Qt 运行错误 分类&#xff0c;并给出 触发示例、原因分析及修复策略…

基于Net海洋生态环境保护系统的设计与实现(代码+数据库+LW)

摘要 随着全球气候变化和人类活动的加剧&#xff0c;海洋生态系统面临着前所未有的威胁。污染、过度捕捞、栖息地破坏等问题严重影响了海洋生物多样性和生态平衡。为了应对海洋生态系统面临的严重威胁&#xff0c;如污染、过度捕捞和栖息地破坏等问题&#xff0c;利用C#语言和…

DoIP路由激活报文

目录 DoIP路由激活报文详解 基本概念 报文结构 响应报文 通信流程 注意事项 **DoIP (Diagnostics over Internet Protocol) 报文详解** **1. DoIP 报文结构** **1.1 通用报文格式** **2. 常见 DoIP 报文类型** **3. 典型 DoIP 报文示例** **3.1 车辆识别请求(广播)** **3.2 车…

学习Python中Selenium模块的基本用法(8:元素操作-2)

定位网页元素后&#xff0c;调用is_displayed函数可以判断元素的显示状态&#xff0c;如百度网站中有默认隐藏的元素&#xff0c;此时即可使用is_displayed函数判断该元素的显示状态&#xff0c;如下面代码所示&#xff1a;driver webdriver.Chrome() driver.get("https:…

双指针:从「LC11 盛最多水的容器」到「LC42 接雨水」

LC11 盛最多水的容器 选择两条线&#xff0c;它们与x轴构成的容器可以盛的水量取决于两条线中较短的那条以及两条线之间的距离。 朴素的思想是使用i和j遍历height中的所有线&#xff0c;但是这样的时间复杂度是O(n2)O(n^2)O(n2)。 我们让i从0开始&#xff0c;j从n-1开始&…

WINTRUST!_GetMessage函数分析之CRYPT32!CryptSIPGetSignedDataMsg函数的作用是得到nt5inf.cat的信息

UEDIT打开nt5inf.cat。第一部分&#xff1a;BOOL _GetMessage(CRYPT_PROVIDER_DATA *pProvData) {DWORD dwMsgEncoding;SIP_SUBJECTINFO *pSubjInfo;SIP_DISPATCH_INFO *pSip;DWORD cbEncodedMsg;BYTE *pbEncodedMsg;DWORD …

编译esp32报错解决办法

报错信息&#xff1a;CMake Error at build/CMakeFiles/git-data/grabRef.cmake:48 (file):file failed to open for reading (No such file or directory):这个错误是由于 Git 的安全检查导致的。从错误信息可以看出&#xff0c;Git 检测到了"可疑的所有权"&#xf…

【AI】常见8大LLM大语言模型地址

序号AI名称地址1 ChatGPT &#xff08;OpenAI&#xff09;https://chat.openai.com/2Gemini (Google personal AI assistant)https://gemini.google.com/app3Grok (xAI Grok LLM)https://x.ai/4DeepSeek (DeepSeek AI chatbot)DeepSeek5Claude (Anthropic Claude AI)App unavai…

软件系统的部署方式:单机、主备(冷主备、热主备)、集群

一、单机部署单机部署是将软件系统所有组件&#xff08;应用、数据库等&#xff09;部署在单台服务器上&#xff0c;架构简单、成本低但存在单点故障风险&#xff0c;适用于低负载或测试场景。一台服务器坏了&#xff0c;软件系统无法服务。二、主备&#xff08;冷主备、热主备…

从体验到系统工程丨上手评测国内首款 AI 电商 App

作者&#xff1a;王晨&#xff08;望宸&#xff09; 产品界面&#xff0c;往往体现了产品的设计哲学&#xff0c;界面是产品的第一入口。 近期&#xff0c;1688 推出了 1688 AI App&#xff0c;这貌似是国内第一个电商领域的独立 AI App 应用&#xff08;若不是&#xff0c;欢…

QML QQuickImage: Cannot open: qrc:/images/shrink.png(已解决)

此问题是 在 QT Quick 项目 显示图片的时候 遇到&#xff0c;显示&#xff1a;QML QQuickImage: Cannot open: qrc:/images/shrink.png&#xff0c;不能 打开 图片。为了解决此问题&#xff0c;找了很多资料&#xff0c;虽然是比较简单&#xff0c;但对于初学者来说&#xff0c…

maven scope 详解

Maven 的 scope用于定义依赖项在项目构建生命周期中的可见性和传递性&#xff0c;控制依赖在编译、测试、运行等阶段的可用性及是否被打包到最终产物中。以下是详细解析&#xff1a;⚙️ ​​一、Scope 的核心作用​​​​生命周期控制​​决定依赖在编译、测试、运行阶段的可用…

Python的一次实际应用:利用Python操作Word文档的页码

Python的一次实际应用&#xff1a;利用Python操作Word文档的页码 需求&#xff1a;一次性处理24个文档的页码。 文档详情&#xff1a; 1、每个word文档包含800页左右&#xff0c;每一页包含一个标题和一张图片。 2、由于图片有横排也有竖排&#xff0c;因此&#xff0c;每页文档…

Android15 GKI版本分析Kernel Crash问题

环境介绍编译主机&#xff1a;amd64 Ubuntu 22.04Android源码&#xff1a;Android15 GKIKernel版本&#xff1a;Linux 6.16Android构建系统&#xff1a;bazel构建工具链&#xff1a;gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-定位Linux…

rocky 9部署Zabbix监控

一、rocky安装 需要注意在设置root用户密码时&#xff0c;勾选ssh远程连接 安装完成后直接用root登录 1. 网络配置 输入nmtui 进入网络配置界面 选择 Edit a connection&#xff0c;再选择接口 ens3 IPV4更改为Maual 手动模式 根据实际环境配置IP地址 重启网络 systemctl …

从9.4%到13.5%:ICDM2025录取率触底反弹,竞争压力稍缓

近日&#xff0c;ICDM 2025公布了论文录用结果。本次大会共收到785篇有效论文投稿&#xff0c;最终&#xff0c;共有106篇常规论文和70篇短论文被接收&#xff0c;总体接收率为22.4%&#xff0c;其中全文论文的接收率为13.5%。与前年9.4%、去年11.09%的录取率相比&#xff0c;I…

linux上安装methylkit -- 安全下车版 (正经版: Linux环境下安装methylKit的实践与避坑指南)

题外话&#xff1a; 我踩过的坑&#xff0c;都将成为我写贴的素材&#xff01;(ㄒoㄒ) 整整安装了两天&#xff0c;这里面的滋味懂的都懂。 希望开发作者持续维护。 希望有人或者作者持续打包成sigularity镜像使用&#xff0c;并且直接传到github上&#xff0c;传到docker上下…

【leetcode】114. 二叉树展开为链表

文章目录题目题解1. 递归2. 迭代3. 右指针重排&#xff0c;始终将右子树添加到左子树的最右题目 114. 二叉树展开为链表 题解 1. 递归 先序遍历然后将数组操作 for i in range(1, len(res)):prev, curr res[i - 1], res[i]prev.left Noneprev.right curr# Definition fo…

Vibe Coding、AI IDE/插件

概述 Vibe Coding&#xff0c;氛围编程&#xff0c;AI辅助编程&#xff0c;三剑客&#xff1a; Google Gemini&#xff1a;OpenAI GPT&#xff1a;Anthropic Claude&#xff1a; IDE Cursor 基于VS Code开发。 特性&#xff1a; AI驱动的代码生成&#xff1a;输入想要的…

Unity高级UI拖动控制器教程

在游戏开发过程中&#xff0c;UI组件的拖动功能是一个常见的需求。特别是在需要实现拖动、边界检测、透明度控制以及动画反馈等功能时&#xff0c;编写一个高级UI拖动控制器将非常有用。在本文中&#xff0c;我们将创建一个支持多种Canvas模式和更精确边界检测的高级UI拖动控制…