代码随想录算法训练营第三十六天|62.不同路径、 63. 不同路径 II、343.整数拆分(可跳过)、96.不同的二叉搜索树(可跳过)

62.不同路径

在这里插入图片描述

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

思路:当前状态的只有可能是从上面或者左边过来的,所以 dp[i][j] = dp[i-1] + dp[j-1]

题解:

    public int uniquePaths(int m, int n) {if (m == 1 && n == 1) {return 1;}int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (i == 0 || j == 0) {dp[i][j] = 1;} else {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m - 1][n - 1];}

63. 不同路径 II

在这里插入图片描述

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

思路:
对于第一行中的元素(不包括第一个元素),路径数量只取决于左边格子的路径数量。
对于第一列中的元素(不包括第一个元素),路径数量只取决于上边格子的路径数量。
对于其他位置,路径数量为上边和左边格子的路径数量之和。
如果当前位置有障碍物,则将该位置的路径数量设为0。

题解:

public int uniquePathsWithObstacles(int[][] obstacleGrid) {// 如果起点本身有障碍物,返回 0,因为无法出发if (obstacleGrid[0][0] == 1) {return 0;}int m = obstacleGrid.length;  // 获取网格的行数int n = obstacleGrid[0].length;  // 获取网格的列数int[][] dp = new int[m][n];  // 创建一个二维数组 dp 用于存储每个位置的路径数量dp[0][0] = 1;  // 起点位置的路径数量设为 1// 遍历网格for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 如果在第一行,且不是第一个元素if (i == 0 && j > 0) {dp[i][j] = dp[i][j - 1];  // 只能从左边的格子过来}// 如果在第一列,且不是第一个元素if (j == 0 && i > 0) {dp[i][j] = dp[i - 1][j];  // 只能从上边的格子过来}// 对于其他位置if (i > 0 && j > 0) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];  // 路径数量为从上边和左边格子的路径数量之和}// 如果当前格子有障碍物,路径数量为 0if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;}}}// 返回终点位置的路径数量return dp[m - 1][n - 1];
}

343.整数拆分

在这里插入图片描述

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

思路:

dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。从1遍历j,然后有两种渠道得到dp[i]
第一种是j * (i - j) 直接相乘。
第二种是j * dp[i - j]。这里的dp[i-j] 表示将 i-j 进一步拆分后得到的最大乘积,这个拆分过程中有递归的影子,所以第二种方式就是一堆数字相乘最后能得到的最大值。

题解:

    public int integerBreak(int n) {// dp[i] 表示将正整数 i 拆分成至少两个正整数的和后,这些正整数的乘积的最大值。int[] dp = new int[n + 1];dp[2] = 1;/*遍历计算:从 i=3 开始遍历到 i=10,对每个 i 进行如下计算:当 i=3 时,j 可以取 1 或 2,分别计算 j*(3-j) 和 j*dp[3-j],取最大值,得到 dp[3] = 2。当 i=4 时,j 可以取 1、2 或 3,分别计算 j*(4-j) 和 j*dp[4-j],取最大值,得到 dp[4] = 4。当 i=5 时,j 可以取 1、2、3 或 4,分别计算 j*(5-j) 和 j*dp[5-j],取最大值,得到 dp[5] = 6。当 i=6 时,j 可以取 1、2、3、4 或 5,分别计算 j*(6-j) 和 j*dp[6-j],取最大值,得到 dp[6] = 9。当 i=7 时,j 可以取 1、2、3、4、5 或 6,分别计算 j*(7-j) 和 j*dp[7-j],取最大值,得到 dp[7] = 12。当 i=8 时,j 可以取 1、2、3、4、5、6 或 7,分别计算 j*(8-j) 和 j*dp[8-j],取最大值,得到 dp[8] = 18。当 i=9 时,j 可以取 1、2、3、4、5、6、7 或 8,分别计算 j*(9-j) 和 j*dp[9-j],取最大值,得到 dp[9] = 27。当 i=10 时,j 可以取 1、2、3、4、5、6、7、8 或 9,分别计算 j*(10-j) 和 j*dp[10-j],取最大值,得到 dp[10] = 36。*/for (int i = 3; i <= n; i++) {for (int j = 1; j <= i - j; j++) {
//                max(j * (i-j), j * dp[i-j]):这部分是关键,它考虑了两种情况:
//                j * (i-j):将整数 i 拆分为两个数,即 j 和 i-j,它们的乘积为 j * (i-j)。
//                j * dp[i-j]:将整数 i 拆分成 j 和若干个数之和,其中至少一个数大于 1。dp[i-j] 表示将 i-j 进一步拆分后得到的最大乘积,因此乘积为 j * dp[i-j]。
//                max(dp[i], ...):这部分确保我们每次更新 dp[i] 时,取最大的乘积。
//                因为我们要求的是整体的最大乘积,所以要比较当前计算出的乘积与之前已经计算过的 dp[i] 的值,取其中较大的那个作为 dp[i] 的值。也就是j取不同值时算到的各个dp[i]中取最大的dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));}}return dp[n];}

96.不同的二叉搜索树(可跳过)

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

数学思路:
卡特兰数的简单应用,递推通项公式都可以简单求解。
通项公式: f ( n ) = 1 n + 1 C 2 n n f(n) = \frac{1}{n+1} C_{2n}^{n} f(n)=n+11C2nn

递推公式: f ( n ) = ∑ k = 1 n f ( n − k ) f ( k − 1 ) = ( 2 n ) ! ( n + 1 ) ! n ! f(n) = \sum_{k=1}^{n} f(n-k) f(k-1) = \frac{(2n)!}{(n+1)!n!} f(n)=k=1nf(nk)f(k1)=(n+1)!n!(2n)!

通过这道题可以非常简单的得到递推公式:

  1. 选数字k作为二叉排序树的根节点
  2. 小于k的数字(1, 2, …, k-1)构成左子树,左子树一共有 f ( k − 1 ) f(k-1) f(k1) 种可能
  3. 大于k的数字 (k+1, …, n)构成右子树,右子树一共有 f ( n − k ) f(n-k) f(nk)种可能
  4. 选k作为根节点一共有 f ( n − k ) f ( k − 1 ) f(n-k) f(k-1) f(nk)f(k1) 种可能
  5. 一共有n个数字可以作为根节点,故一共 f ( n ) = ∑ k = 1 n f ( n − k ) f ( k − 1 ) f(n) = \sum_{k=1}^{n} f(n-k) f(k-1) f(n)=k=1nf(nk)f(k1)种可能

dp思路:

  1. 目标:计算节点数量为 i 时的二叉搜索树数量 dp[i]。
  2. 遍历根节点:对于每个可能的根节点值 j,其中 j 的取值范围是从 1 到 i。这表示我们考虑将每个节点作为根节点,来构建二叉搜索树。
  3. 左子树和右子树:当我们选择节点 j 作为根节点时,左子树包含节点值从 1 到 j-1 的所有节点,右子树包含节点值从 j+1 到 i 的所有节点。
  4. 状态转移:对于每个根节点 j,其左子树的节点数量为 j-1,右子树的节点数量为 i-j。因此,以节点 j 为根的二叉搜索树数量为 dp[j - 1] * dp[i - j]。
  5. 累加更新:将所有可能的以节点 j 为根的二叉搜索树数量累加到 dp[i] 上,即 dp[i] += dp[j - 1] * dp[i - j];。这样可以计算出节点数量为 i 时的所有可能的二叉搜索树数量。
  6. 结果:最终,dp[i] 的值即为节点数量为 i 时的二叉搜索树数量。

数学题解:

    //数学方法public int numTrees(int n) {// 计算组合数 C(2n, n)long C = binomialCoeff(2 * n, n);// 返回 Catalan 数 C_n = C / (n + 1)return (int) (C / (n + 1));}// 计算二项式系数 C(n, k)private long binomialCoeff(int n, int k) {long res = 1;// C(n, k) = C(n, n - k), 提高效率if (k > n - k) {k = n - k;}// 计算 C(n, k)for (int i = 0; i < k; ++i) {res *= (n - i);res /= (i + 1);}return res;}

dp题解:

  public int numTrees(int n) {// 创建一个数组用于存储不同节点数量对应的二叉搜索树数量int[] dp = new int[n + 1];// 初始化,当节点数量为 0 或 1 时,只有一种情况,即空树或只有一个节点的树dp[0] = 1;dp[1] = 1;// 计算不同节点数量对应的二叉搜索树数量// 变量 i 表示当前正在计算的节点数量for (int i = 2; i <= n; i++) {// 变量 j 表示当前正在考虑作为根节点的值,// 因为是BST,左子树包含了从 1 到 j-1 的节点,右子树包含了从 j+1 到 i 的节点for (int j = 1; j <= i; j++) {//头结点从1开始遍历,遍历到结点i// 将每个数作为根节点,计算其左右子树的 BST 数量,// 然后将左右子树的数量相乘,累加得到以当前数为根节点的 BST 数量// 但是为了求当前i节点为根节点的数量,还要把2到i的节点数量加起来dp[i] += dp[j - 1] * dp[i - j];}}// 返回 n 个节点的 BST 数量return dp[n];}

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

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

相关文章

Docker 安装Nginx部署网站 防火墙端口 数据卷挂载

拉取镜像 docker pull nginx#不写版本号 表示最新版本查看是否拉取成功 docker images#成功 nginx latest 605c77e624dd 2 years ago 141MB mysql 8.0 3218b38490ce 2 years ago 516MB mysql latest 3218b38490ce 2 years ago 5…

virtualbox(7.0) ubuntu(22) 和win11共享文件夹

在虚拟机中安装增强功能。在virtualbox中配置 执行命令将用户加入vboxsf组 sudo adduser your_usrname vboxsf 重启ubuntu即可

LeetCode 585, 438, 98

目录 585. 2016年的投资题目链接表要求知识点思路代码 438. 找到字符串中所有字母异位词题目链接标签思路代码 98. 验证二叉搜索树题目链接标签合法区间思路代码 中序遍历思路代码 585. 2016年的投资 题目链接 585. 2016年的投资 表 表Insurance的字段为pid、tiv_2015、tiv…

Charles网络抓包工具手机抓包配置(二)

目录 事前配置 配置手机连接 代理设置 Https请求设置 手机安装根证书 手机连接代理 证书获取​编辑 证书安装 成果 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们…

CesiumJS【Basic】- #020 加载glb/gltf文件(Primitive方式)

文章目录 加载glb/gltf文件(Primitive方式)1 目标2 代码实现3 资源文件加载glb/gltf文件(Primitive方式) 1 目标 使用Primitive方式加载glb/gltf文件 2 代码实现 import * as Cesium from "cesium";const viewer = new Cesium.Viewer

ElementPlus Combogrid 组件

效果图: 1.声明 Props类型 export type comboGridPropType { modelValue: any; url: string; keyField?: string; labelField?: string; filterOptions?: Array<ISearchOption>; tableColumns?: Array<TableColumns>; enableField?: string; multiple?: …

Psychtoolbox 脑电实验范式之mp4视频绘制

1. 读取 首先需要使用到Screen(‘OpenMovie’)函数&#xff0c;该函数可以读取mp4、gif格式的数据&#xff0c;具体方式如下&#xff1a; clear; clc; Screen(Preference, SkipSyncTests, 1); screens Screen(Screens); screenNum max(screens); [window, screenRect] Scr…

C++语法20 一维数组及其相关问题详解

这是《C算法宝典》语法入门篇的第20节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#xff1a;C语法入门&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&…

串口通信中字符和16进制显示的区别分析,串口发送数据

分析的原因 在对串口传送数值时&#xff0c;不想再进行一步字符转化&#xff0c;想要直接传送数值。但查看时就需要以16进制的数值形式查看数据&#xff0c;否则将不能看到正确的数据显示 下图是对串口寄存器发送一个16bit位的数据 void uart0Senduint16(UINT16 dat){SBUFdat…

element-plus 日期选择添加确定按钮

需求&#xff1a;选择日期后&#xff0c;点击确定按钮关闭面板 思路&#xff1a; 使用shortcuts自定义确定和取消按钮选择日期后使用handleOpen()强制开启面板点击确定后使用handleClose()关闭面板 <template><el-date-pickerref"pickerRef"v-model"…

【Android11】开机启动日志捕捉服务

一、前言 制作这个功能的原因是客户想要自动的记录日志中的报错和警告到设备的内存卡里面。虽然开发者模式中有一个“bug report” 会在/data/user_de/0/com.android.shell/files/bugreports/目录下生成一个zip包记录了日志。但是客户觉得这个日志很难获取到他们需要的信息&am…

基于盲信号处理的声音分离——基于自然梯度的ICA算法

基于自然梯度的ICA算法主要利用相互独立的随机信号的联合概率密度是各自概率密度的乘积这一特性&#xff0c;建立了等独立性度量原则&#xff0c;具体实现如下。 首先&#xff0c;输出信号 相互独立&#xff0c;则其概率密度满足 上式中 表示 的概率密度函数&#xff0c;可以…

怎么扫描图片变成pdf格式?办公人士值得收藏的宝藏工具

将图片扫描并转换为PDF格式可以通过多种途径实现&#xff0c;无论是使用专业的扫描仪还是智能手机&#xff0c;都有相应的方法。 PDF 是什么&#xff1f; PDF&#xff0c;全称为 Portable Document Format&#xff08;便携式文档格式&#xff09;&#xff0c;是由Adobe System…

12,SPI

Flash芯片&#xff1a;W25Q64&#xff0c;可以看成一个储存器 W25Q64芯片和单片机之间的通信方式是SPI SPI:串行同步全双工&#xff0c;主从通信 判断一个设备是不是SPI通信&#xff0c;看是否有这几个线&#xff1a;SCK&#xff0c;CS&#xff0c;MISO&#xff0c;MOSI SCK…

Altium Designer软件下载安装「PCB设计软件」安装包资源获取

Altium Designer作为一款集成化的电子产品开发系统&#xff0c;它主要适用于Windows操作系统&#xff0c;为电子设计工程师们提供了一个高效、便捷的工作平台。 在Altium Designer中&#xff0c;原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出…

vuex的学习

vuex vuex是个插件&#xff0c;用于多个组件操作共享变量 引入&#xff1a;数字操作案例 基于组件自定义事件而实现的操作数字案例如下&#xff1a; App.vue <template><div id"app"><input class"num_input" type"text" v…

LeeCode 994. 腐烂的橘子

原题链接994. 腐烂的橘子 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;采用bfs遍历图&#xff0c;将烂橘子加入队列&#xff0c;然后将被烂橘子感染的橘子也加入队列&#xff0c;bfs的具体细节就不多说了&#xff0c;可以自己去搜&#xff0c;很简单&#xff0c;…

560.滑动窗口最大值

滑动窗口最大值 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目大意&#xff0c;返回每个窗口内的最大值。 思路-优先队列 优先队列&#xff08;堆&#xff09;&#xff0c;其中的大根堆可以实时维护一系列元素中的最大值。 每当我们向右移动窗口时&#…

地形沉降测量仪器静力水准仪应用全攻略

在地形监测和地质勘探的领域中&#xff0c;地形沉降测量是一项至关重要的工作。它不仅能够及时揭示地质结构的变化&#xff0c;还能为城市规划和基础工程建设提供宝贵的数据支持。在众多测量工具中&#xff0c;静力水准仪以其高精度、高效率的特点&#xff0c;成为地形沉降测量…

AI绘画生成人物的关键词怎么写?手把手教你学会

AI绘画生成人物的关键词怎么写&#xff1f;随着人工智能技术的不断发展&#xff0c;AI绘画已成为艺术领域的一股新势力。特别是在生成人物绘画方面&#xff0c;AI技术以其独特的优势和无限的可能性&#xff0c;为我们带来了全新的创作体验。下面&#xff0c;本文将分享AI绘画生…