代码随想录第三十五天(一刷C语言)|整数拆分不同的二叉搜索树

本文主要是介绍代码随想录第三十五天(一刷C语言)|整数拆分不同的二叉搜索树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。

一、整数拆分

思路:参考carl文档。

1、确定dp数组以及下标的含义:分拆数字i,可以得到的最大乘积为dp[i]。

2、确定递推公式:从1遍历j,dp[i]可以由j * (i - j) 直接相乘。也可以由j * dp[i - j](相当于是拆分(i - j))得到。dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j))。

3、dp数组的初始化:初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1。

拆分0与1是无意义的。

4、确定遍历的方向:由递推公式知遍历方向为从左到右。

5、举例n为某个数的时候,推到dp数组。

ledcode题目:https://leetcode.cn/problems/integer-break/

AC代码:

//初始化DP数组
int *initDP(int num) {int* dp = (int*)malloc(sizeof(int) * (num + 1));int i;for(i = 0; i < num + 1; ++i) {dp[i] = 0;}return dp;
}//取三数最大值
int max(int num1, int num2, int num3) {int tempMax = num1 > num2 ? num1 : num2;return tempMax > num3 ? tempMax : num3;
}int integerBreak(int n){int *dp = initDP(n);//初始化dp[2]为1dp[2] = 1;int i;for(i = 3; i <= n; ++i) {int j;for(j = 1; j < i - 1; ++j) {//取得上次循环:dp[i],原数相乘,或j*dp[]i-j] 三数中的最大值dp[i] = max(dp[i], j * (i - j), j * dp[i - j]);}}return dp[n];
}

二、不同的二叉搜索树

思路:参考carl文档。

1、确定dp数组及其下标的含义:1到i为节点组成的二叉搜索树的个数为dp[i]。

2、确定递推公式:dp[i] += dp[j - 1] * dp[i - j] ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量。

3、dp数组的初始化:空节点也是一棵二叉树,也是一棵二叉搜索树。初始化dp[0] = 1。并且防止左右子树相乘出现0值的情况。

4、确定遍历方向:由递推公式知,节点数为i的状态依靠于 i之前节点数的状态。故遍历i里面每一个数作为头结点的状态,用j来遍历。

5、举例n为某个数的时候dp数组的状态。

lecode题目:https://leetcode.cn/problems/unique-binary-search-trees/description/

AC代码:

//开辟dp数组
int *initDP(int n) {int *dp = (int *)malloc(sizeof(int) * (n + 1));int i;for(i = 0; i <= n; ++i)dp[i] = 0;return dp;
}int numTrees(int n){//开辟dp数组int *dp = initDP(n);//将dp[0]设为1dp[0] = 1;int i, j;for(i = 1; i <= n; ++i) {for(j = 1; j <= i; ++j) {//递推公式:dp[i] = dp[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];
}

这篇关于代码随想录第三十五天(一刷C语言)|整数拆分不同的二叉搜索树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510986

相关文章

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P