代码随想录算法训练营第33天|62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树

news2025/1/11 2:53:16

打卡Day33

  • 1.62.不同路径
  • 2.63. 不同路径 II
  • 3.343. 整数拆分
  • 4.96.不同的二叉搜索树

1.62.不同路径

题目链接:62.不同路径
文档讲解: 代码随想录

动规五部曲:
(1)确定dp数组和下标的含义
dp[ i ][ j ] 表示到达 i x j 网络的右下角有的路径数
(2)确定递推公式
机器人只能向下或者向右移动一步,那么就有dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1]
(3)初始化
如果,m = 1 或者 n = 1,那么只有一种方法。当m,n 都大于等于2时,dp[ 0 ][ 1 ] = 1,dp[ 1 ][ 0 ] = 1
(4)遍历顺序:两层迭代,都从前往后
(5)打印数组

以上是我自己的思路,也不知道能不能做出来!初始化出现了问题,应该修改为除了dp [0][0](因为没有实际意义),dp[0] 和 dp[][0] 值都为1。遍历顺序再具体一点,先固定 i ,从前往后填满,然后令 i + 1,重复填满。运行出错,发现当起点和终点重合的时候(即 m = 1,n = 1),dp[0][0] = 1,那么就可以直接在新建列表的时候初始值为1。

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        #创建dp数组
        dp = [[1] * n for _ in range(m)]
        #初始化
        #第一行
        # for j in range(1, n):
        #     dp[0][j] = 1
        # #第一列
        # for i in range(1, m):
        #     dp[i][0] = 1
        #填满
        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
        
        return dp[m - 1][n - 1]

2.63. 不同路径 II

题目链接:63. 不同路径 II
文档讲解: 代码随想录

动规五部曲:
(1)确定dp数组和下标
dp[ i ][ j ] 表示到达 i x j 网络的右下角有的路径数
(2)确定递归公式
dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1],但要考虑若该点有障碍物,那么就保持初始状态
(3)初始化
新建的时候初始值为0,遍历第一行和第一列的时候,一旦某点是障碍,那么该点及之后的点都不可达,也就是保持初始化状态不变
(4)遍历顺序:两层迭代,先固定 i ,从前往后填满,然后令 i + 1,重复填满
(5)打印数组

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        #新建dp数组
        dp = [[0] * n for _ in range(m)]
        #初始化
        for j in range(n):
            if obstacleGrid[0][j] == 0:
                dp[0][j] = 1
            else:
                break
        for i in range(m):
            if obstacleGrid[i][0] == 0:
                dp[i][0] = 1
            else:
                break
        #遍历
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 0:
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        return dp[m - 1][n - 1]

3.343. 整数拆分

题目链接:343. 整数拆分
文档讲解: 代码随想录

动规五部曲:
(1)确定dp数组和下标含义
dp[ i ]表示拆分数字 i,可以得到的最大乘积
(2)确定递推公式
从 1 遍历到 j,两种渠道得到dp[ i ],一个是 j 与 (i - j)相乘,另一种是 j 和 dp[i - j] 相乘。因为是从1遍历到 j,所以对 j 的拆分已经在遍历过程中实现了。因此递推公式为:dp[ i ] = max(dp[ i ], j * (i - j), j * dp[i - j])。为什么还要比较dp[i]呢?因为在递推公式推导的过程中,每次计算dp[i],取最大的而已。
(3)初始化
dp[0] dp[1] 就不应该初始化,也就是没有意义的数值。因为拆分0和1是无解的,因此初始化从2开始,dp[2] = 1。
(4)遍历顺序:从前往后遍历,需要两层循环,一层为 i,一层为 j。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让 j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。至于 i 是从3开始,这样dp[i - j]就是dp[2]正好可以通过我们初始化的数值求出来。可以进一步优化,拆分一个数n 使之乘积最大,那么一定是拆分成m个近似相同的子数相乘才是最大的。因此, j 遍历,只需要遍历到 n/2 就可以,后面就没有必要遍历了,一定不是最大值。
(5)打印数组

class Solution(object):
    def integerBreak(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [0] * (n + 1)
        #初始化
        dp[2] = 1
        for i in range(3, n + 1):
            for j in range(1, i // 2 + 1):
                dp[i] = max(dp[i], j * (i - j), j * dp[i - j])
        return dp[n]

4.96.不同的二叉搜索树

题目链接:96.不同的二叉搜索树
文档讲解: 代码随想录

又是完全没有思路。

作题的步骤:画个图举例看看。
在这里插入图片描述
然后就可以发现头节点为1时,右子树会有2个节点,和头节点为3时,左子树有2个节点,这两种情况,两棵树的布局是一样的。

动规五部曲:
(1)确定数组和下标
dp[ i ]表示节点数为 i 时, 互不相同的 二叉搜索树的种类
(2)递推关系式和遍历顺序
以3为例,可以分为头节点为1、2、3的三种情况。两层循环,一个是 i,一个是 j。当以 i 为节点总数时,以 j 为头节点,左子树有 j - 1个节点,右子树有 i - j 个节点。累加公式为:dp[ i ] += dp[ j ] * dp[i - j].
(3)初始化
dp[0] = 1
(4)打印数组

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [0] * (n + 1)
        dp[0] = 1
        for i in range(1, n + 1):
            for j in range(0, i + 1):
                dp[i] += dp[j - 1] * dp[i - j]
        return dp[n]

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

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

相关文章

JNDI注入-高版本绕过

参考博客&#xff1a; JNDI注入与动态类加载 探索高版本 JDK 下 JNDI 漏洞的利用方法 - 跳跳糖 (tttang.com) 分析版本 jdk8u201 分析流程 修复 在ldap绕过中&#xff0c;我们讲了LDAP的修复&#xff0c;下面用jdk8u201具体来看下修复。 修复之前&#xff0c;利用是在L…

档案馆可视化管理系统

通过图扑可视化技术&#xff0c;实现档案馆内文件、资料的高效管理与实时监控&#xff0c;提升档案数据的查询、存档和维护效率。

【建议收藏】大数据Hadoop实战入门手册,配套B站视频教程1小时速通

大数据Hadoop入门实战专栏 大数据技术概述大数据简介Hadoop简介 大数据集群环境搭建环境搭建概述虚拟机准备集群搭建Java开发环境准备 分布式文件系统HDFS学习前期概述HDFS Shell命令HDFS可视化界面HDFS Java API编程环境初始化API基本使用创建目录更改目录权限上传文件查看目录…

docker pgsql实现pg_jieba全文检索

安装pg_jieba分词器 安装依赖工具 查看docker运行的所有容器 docker ps进入pg数据库容器 docker exec -it postgres4postgis bash安装必要的工具和依赖 apt-get install -y git build-essential cmake libpq-dev postgresql-server-dev-all安装pg_jieba分词 git clone ht…

Apache DolphinScheduler用户线上Meetup火热来袭!

Apache DolphinScheduler 社区 8 月用户交流会精彩继续&#xff01;本次活动邀请到老牌农牧产品实业集团铁骑力士架构工程师&#xff0c;来分享Apache DolphinScheduler在现代农牧食品加工场景中的应用实践。此外&#xff0c;还将有社区活跃贡献者以Apache DolphinScheduler为例…

为什么AI会一本正经地胡说八道

泛泛地说&#xff0c;AI一本正经地胡说八道的原因可以归结为&#xff1a;AI的理解能力受到其训练数据和算法的限制&#xff0c;如果问题表达不清晰或者背景信息不足&#xff0c;AI可能会产生错误的推理或输出&#xff1b;AI语言模型本质上是基于统计学习和模式匹配的&#xff0…

基于新型电力系统的有序充电解决方案

安科瑞 耿敏花 摘要&#xff1a;近年来,新能源汽车的销量快速增长,相应的充电桩数量也急剧增加,这一现象可能会给电网和变压器造成负担,与此同时&#xff0c;新型电力系统下以光伏为主的分布式发电系统占比也在逐渐提高&#xff0c;新能源的不稳定性叠加充电需求的不确定性会给…

MySQL基础练习题13-指定日期的产品价格

题目&#xff1a;找出在 2019-08-16 时全部产品的价格&#xff0c;假设所有产品在修改前的价格都是 10 。 准备数据 分析数据 题目&#xff1a;找出在 2019-08-16 时全部产品的价格&#xff0c;假设所有产品在修改前的价格都是 10 。 准备数据 ## 创建库 create tadabase d…

矩阵管理系统真的好用吗

在这个短视频盛行的时代&#xff0c;每个人都可能是下一个网红。但是&#xff0c;当你的账号遍布各大平台&#xff0c;每个平台都要求你不断更新内容时&#xff0c;你可能会问&#xff1a;有没有一种工具&#xff0c;可以让这一切变得更简单&#xff1f;这就是矩阵管理系统出现…

项目中AOP相关问题

答&#xff1a;AOP是面向切面编程&#xff0c;可以通过定义方法拦截器和切入点&#xff0c;实现将一些逻辑相同的代码块抽取到同一个模块中&#xff0c;这个模块就是切面。代码可以只关注业务实现&#xff0c;不用关注那些通用逻辑。 答&#xff1a;切面&#xff0c;通用模块&…

模型部署优化综述

一、引言 模型部署优化是一个涵盖众多环节的宽泛领域,从模型训练完成到实际硬件部署,涉及多个层面的工作,且每个环节对技术的要求各异。其本质是通过减小模型大小、提高推理速度等手段,使模型能在各种硬件中成功部署并实时有效运行。 二、模型剪枝技术 (一)模型剪枝的…

Oracle基础-集合

集合&#xff1a;两个结果集的字段个数和字段类型必须相同&#xff0c;才能使用集合操作。 --UNION 并集 重复行会去重 (SELECT A,B FROM DUAL UNION SELECT C,D FROM DUAL) UNION (SELECT A,B FROM DUAL UNION SELECT E,F FROM DUAL ); --UNION ALL 全集 包含所有记录 不去重…

学校会拒绝孤独症孩子吗?揭秘专业教育机构的关怀之心

在当今社会&#xff0c;孤独症孩子的教育问题备受关注。许多家长心中都存在着一个担忧&#xff1a;学校会拒绝孤独症孩子吗&#xff1f; 事实上&#xff0c;大多数专业的教育机构都怀揣着一颗关怀之心&#xff0c;不会轻易拒绝这些特殊的孩子。 专业的教育机构深知&#xff0c;…

畅捷通如何远程访问?

随时随地能够远程访问和操作畅捷通已经成为许多职场人士的迫切需求。作为一名有着亲身经历的使用者&#xff0c;今天我就来和大家分享一下实现畅捷通远程访问的绝佳方法。 曾几何时&#xff0c;为了能在外出时也能使用畅捷通办公&#xff0c;我可谓是绞尽脑汁。尝试过多种传统方…

trino开启https

作者&#xff1a;振鹭 一、生成https证书 &#xff08;所用到的openssl和keytool命令都是linux自带的&#xff09; 配置https证书&#xff1a; &#xff08;1&#xff09;创建目录 [hdfshadoop01 hadoop]# mkdir -p /data/ssl/ [hdfshadoop01 hadoop]# cd /data/ssl/&…

【全志H616开发】Linux守护进程

文章目录 守护进程简介基本特点创建一个守护进程通常涉及以下步骤&#xff1a;进程查看指令&#xff1a; 守护进程开发代码示例&#xff1a; 开机自动启动 守护进程 简介 Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性…

C语言斜向钥匙迷宫

目录 开头程序的流程图程序的效果结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语言编译的斜向钥匙迷宫和与之相关的一些东西。 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <Windows.h> void printmaze(co…

数据结构算法-排序(二)

插入排序 插入排序核心 假设数组中的一部数据已经排好序&#xff0c;要插入的数据和这些数据进行比较&#xff0c;直到找到合适的位置插入新数据。 插入排序步骤 插入排序主要有以下步骤构成&#xff1a; 假设有序&#xff0c;我们假设**a[0]**已经排好序待插入的数据为a[j]…

Windows蓝屏问题解决(电脑只要安装了VPN_SV独立客户端)必蓝屏

一、SERNEL_SECURITY_CHECK_FAILURE (139) 蓝屏分析 官方介绍蓝屏现象&#xff0c;官方Windows为了保护电脑&#xff0c;出现故障&#xff0c;自动蓝屏&#xff0c;避免损坏电脑的一种现象&#xff0c;别名buckcheck、蓝屏。 100%复现软件&#xff1a;天融信VPN&#xff0c;同事…

AI赋能交通治理:非机动车监测识别技术在城市街道安全管理中的应用

引言 城市交通的顺畅与安全是城市管理的重要组成部分。非机动车如自行车、电动车、摩托车等在城市交通中扮演着重要角色&#xff0c;但同时也带来了管理上的挑战。尤其是在机动车道上误入非机动车的现象&#xff0c;不仅影响交通秩序&#xff0c;还可能引发交通事故。思通数科…