代码随想录刷题day34丨 62.不同路径 ,63. 不同路径 II

news2024/12/23 8:33:44

代码随想录刷题day34丨 62.不同路径 ,63. 不同路径 II

1.题目

1.1不同路径

  • 题目链接:62. 不同路径 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html

  • 解题思路:动态规划

    • 确定dp数组(dp table)以及下标的含义

      dp[i][j] :表示从(00)出发,到(i, j) 有dp[i][j]条不同的路径。
      
    • 确定递推公式

      想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。
          
      所以:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
      
    • dp数组的初始化

      首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。
      
      for (int i = 0; i < m; i++) dp[i][0] = 1;
      for (int j = 0; j < n; j++) dp[0][j] = 1;
      
    • 确定遍历顺序

      递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,
      那么从左到右一层一层遍历就可以了。
      
    • 举例推导dp数组

      在这里插入图片描述

  • 代码:

    //时间复杂度:O(m × n)
    //空间复杂度:O(m × n)
    class Solution {
        public int uniquePaths(int m, int n) {
            int[][] dp = new int[m][n];
            //初始化
            for(int i = 0;i < m;i++){
                dp[i][0] = 1;
            }
            for(int j = 0;j <n;j++){
                dp[0][j] = 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.2不同路径 II

  • 题目链接:63. 不同路径 II - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html

  • 解题思路:动态规划

    • 确定dp数组(dp table)以及下标的含义

      dp[i][j] :表示从(00)出发,到(i, j) 有dp[i][j]条不同的路径。
      
    • 确定递推公式

      dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
      这里需要注意;(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)
      所以:
      if(obstacleGrid[i][j] == 0){
          dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
      }else{
          dp[i][j] = 0;
      }
      
    • dp数组如何初始化

      for(int i = 0;i < m && obstacleGrid[i][0] == 0;i++){
          dp[i][0] = 1;
      }
      for(int j = 0;j < n && obstacleGrid[0][j] == 0;j++){
          dp[0][j] = 1;
      }
      
      注意代码里for循环的终止条件,一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作,dp[0][j]同理
      
    • 确定遍历顺序

      从左到右一层一层遍历
      for(int i = 1;i < m;i++){
          for(int j = 1;j < n;j++){
              if(obstacleGrid[i][j] == 0){
                  dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
              }else{
                  dp[i][j] = 0;
              }
          }
      }
      
    • 举例推导dp数组

      • 举例

在这里插入图片描述

- 对应的dp图

在这里插入图片描述

  • 代码:

    //时间复杂度:O(m × n)
    //空间复杂度:O(m × n)
    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int m = obstacleGrid.length;
            int n = obstacleGrid[0].length;
            int[][] dp = new int[m][n];
    
            //如果在起点或终点出现了障碍,直接返回0
            if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
                return 0;
            }
            //初始化
            for(int i = 0;i < m && obstacleGrid[i][0] == 0;i++){
                dp[i][0] = 1;
            }
            for(int j = 0;j < n && obstacleGrid[0][j] == 0;j++){
                dp[0][j] = 1;
            }
            for(int i = 1;i < m;i++){
                for(int j = 1;j < n;j++){
                    if(obstacleGrid[i][j] == 0){
                        dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                    }else{
                        dp[i][j] = 0;
                    }
                }
            }
            return dp[m - 1][n - 1];
        }
    }
    
  • 总结:

    • 该题与题(62.不同路径)的区别在于初始化的方式不同

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

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

相关文章

【Linux】-基本指令(上)

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;深入代码世界&#xff0c;了解掌握 Linux 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 与Windows环境不同&#xff0c;我们…

ASCII字符和中文字符的显示

目录 前言 ASCII字符的点阵显示 获取点阵 描点 main 中文字符的点阵显示 指定编码格式 汉字区位码 汉字点阵显示实验 打开汉字库文件 编写显示汉字的函数 使用 lcd_put_chinese 函数 前言 板子为韦东山老师的imx6ull板&#xff0c;要在LCD上实现字符的显示&#xf…

idea集成和使用Git指南

前言 Git是一个分布式的版本控制工具&#xff0c;可以管理我们开发过程中的源代码文件&#xff0c;而idea是Java的集成开发环境&#xff0c;在idea中配置Git&#xff0c;可以提高我们的团队开发效率。因此在idea中集成Git并使用Git管理我们的源代码是必要的 第一步&#xff1a;…

多线程的高手——海王(浅谈线程概念)

听到大海的声音了吗 让我想想炉石里面能被成为海王的卡牌 我个人感觉 就是拿着三叉戟的甲壳元素 可是这牌被删了我心痛 背景知识 还是地址空间那点破事&#xff01; OS进行内存管理&#xff0c;不是以字节为单位的&#xff0c;而是以内存块为单位的&#xff01; 默认是4k…

Halo 开发者指南——项目运行、构建

准备工作 环境要求 OpenJDK 17 LTSNode.js 20 LTSpnpm 9IntelliJ IDEAGitDocker&#xff08;可选&#xff09; 名词解释 工作目录 指 Halo 所依赖的工作目录&#xff0c;在 Halo 运行的时候会在系统当前用户目录下产生一个 halo-next 的文件夹&#xff0c;绝对路径为 ~/ha…

学习图解算法 使用C语言

图解算法 使用C语言 也就是通过C语言实现各种算法 链接&#xff1a;百度云盘 提取码&#xff1a;1001

【CMake】使用CMake在Visual Stdudio构建一个最简单的项目

一、准备工作 首先&#xff0c;确保在 V i s u a l S t u d i o Visual\ Studio Visual Studio上安装了 C C C桌面开发&#xff0c;如果没有安装&#xff0c;打开 V i s u a l S t u d i o I n s t a l l e r Visual\ Studio\ Installer Visual Studio Installer就可以修改…

【JAVA干货店】带你玩转数组与递归

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 递归利用递归求斐波那契数列数组入门 递归 自己调用自己 StackOverflowError:栈溢出错误,出现的原…

滑动窗口(3)_最大连续1的数组个数III

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 滑动窗口(3)_最大连续1的数组个数III 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …

CTFHub技能树-信息泄露-HG泄漏

目录 漏洞产生原因 解题过程 当开发人员使用 Mercurial 进行版本控制&#xff0c;对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。 漏洞产生原因 Mercurial(hg)是一种分布式版本控制系统&#xff0c;它与Git类似也可以用于管…

【Java】线程状态:线程生命周期的六个阶段

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在Java中&#xff0c;线程可以处于多种状态&#xff0c;这些状态描述了线程的生命周期。了解这些状态及其转换条件对于编写高效且无错误的多线程应用程序至关重要。本文将总结Java线程的几种状态&am…

半导体制造技术中的沉积和驱入(Deposition and drive-in)过程

来源&#xff1a;半导体制造技术导论——萧宏 沉积和驱入过程 图5.34 硼掺杂工艺高温扩散炉系统示意图 图5.35 扩散掺杂工艺流程 图5.36 扩散工艺在超浅结深&#xff08;USJ&#xff09;上的应用

C++设计模式——Prototype Pattern原型模式

一&#xff0c;原型模式的定义 原型模式是一种创建型设计模式&#xff0c;它允许通过克隆已有对象来创建新对象&#xff0c;从而无需调用显式的实例化过程。 原型模式的设计&#xff0c;使得它可以创建一个与原型对象相同或类似的新对象&#xff0c;同时又可以减少对象实例化…

项目实战应用Redis分布式锁

Redis分布式锁 一、前言二、Redis分布式锁过期处理三、Redis分布式实现3.1 基于Jedis 的API实现分布式锁3.1.1 基础命令3.1.2 基于Jedis API的分布式锁3.1.3 基于Lua脚本实现分布式锁 四、Redisson的使用五、Redision锁 核心源码分析六、总结 一、前言 对于项目中使用Redis分布…

jdk相关介绍

JDK&#xff0c;全称Java Development Kit&#xff0c;是Java语言开发的基础工具包。它包含了Java运行时环境&#xff08;JRE&#xff09;以及用于开发Java应用程序的各种工具和库。JDK为Java程序员提供了编译、调试和运行Java应用程序所需的全部环境。 JDK的主要组成部分包括&…

OpenCV_图像像素读写操作

本文详细介绍了如何在C项目中使用OpenCV进行图像像素的读写操作&#xff0c;包括使用头文件声明Pixel类&#xff0c;通过遍历和指针方式处理灰度图和彩色图&#xff0c;以及在主函数中调用这些操作。 数组遍历的方式进行图像像素读写 void QuickDemo::pixelVisit_Demo(Mat&am…

【最新华为OD机试E卷-支持在线评测】增强的strstr(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下&#xff0c;智慧水利作为重要的基础设施之一&#xff0c;正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司&#xff08;以下简称“江河信息”&#xff09;作为高新技术国有企业&#xff0c;坚定致力于打造数…

监控binlog日志监控表变化进行消息通知

前言 由于我们做项目的时候有项目任务管理工具&#xff0c;目前用的最多的是禅道&#xff0c;而我们用的是redmine&#xff0c;而redmine是使用ruby写的&#xff0c;刚好我们这边没有会用ruby的人&#xff0c;所以就有了这样一个小工具&#xff0c;用于监控binlog日志通过钉钉…

机器人相关知识的本身和价值

简要将人类简史分为 农业工业信息智能 四个时代。 在信息时代&#xff0c;知识本身就可以等同于价值。 常识看&#xff0c;学历可以变现&#xff0c;高品质文凭能极大概率获得工资远远高于平均值的工作机会。 在智能时代&#xff0c;知识本身毫无价值&#xff0c;知识的应…