一天一大 leet(三角形最小路径和)难度:中等-Day20200715
时间:2022-07-25
本文章向大家介绍一天一大 leet(三角形最小路径和)难度:中等-Day20200715,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
/ / /
3 2 1 1 3 2
/ /
2 1 2 3
抛砖引玉
- 任意一个元素都可以做根节点
- 那遍历数组,分别以每个元素作为根节点计算以其为根节点存在的不同结构树
- 节点数量i:
i(数量) |
种类 |
拆分 |
---|---|---|
i = 0 |
1 |
|
i = 1 |
1 |
|
i = 2 |
2 |
拆分节点 0+1+1 1+1+0 |
i = 3 |
5 |
拆分节点 0+1+dp[2] 1+1+1 dp[2]+1+0 其中 存在左节点或者右节点是右两个节点存在的可能只有1中 |
i = 4 |
14 |
拆分节点 0+1+dp[3] 1+1+dp[2] dp[2]+1+1 dp[3]+1+0 |
i = 5 |
42 |
拆分节点 0+1+dp[4] 1+1+dp[3] dp[2]+1+dp[2] dp[3]+1+1 dp[4]+1+0 |
- 总结规律():
dp[i] = dp[0]xdp[i-1] + (dp[1]xdp[i-2]) + ... + (dp[i-2]xdp[1]) + dp[i-1]*dp[0]
动态规划
- 声明记录值dp数组
- i<2时 填充默认值1
/**
* @param {number} n
* @return {number}
*/
var numTrees = function (n) {
let dp = Array(n + 1).fill(0)
dp[0] = 1
dp[1] = 1
for (let i = 2; i <= n; ++i) {
for (let j = 1; j <= i; ++j) {
dp[i] += dp[j - 1] * dp[i - j]
}
}
return dp[n]
}
数学
dp[i] = (dp[0]xdp[i-1])x2 + (dp[1]xdp[i-2])x2+(dp[2]xdp[i-3])x2 + ... + dp[n/2]x2
dp[i] = (dp[0]xdp[i-1] + dp[1]xdp[i-2] + dp[2]xdp[i-3] + ... + dp[n/2])/2
剩下的就交给数学推导吧,数学学不好代码都敲不了,泪崩
/**
* @param {number} n
* @return {number}
*/
var numTrees = function (n) {
let C = 1
for (let i = 0; i < n; ++i) {
C = (C * 2 * (2 * i + 1)) / (i + 2)
}
return C
}
递归
使用递归改写动态规划
- dp[i],递归拆分直到小于2,小于2则该位置填充默认值1
- dp[i]存在值则说明该节点数量计算过
/**
* @param {number} n
* @return {number}
*/
var numTrees = function (n) {
let dp = Array(n + 1).fill(0)
function dpFn(x) {
if (x == 0 || x == 1) return (dp[x] = 1)
if (dp[x] > 0) return dp[x]
for (let i = 0; i < x; i++) {
dp[x] += dpFn(i) * dpFn(x - i - 1)
}
return dp[x]
}
return dpFn(n)
}
- 单例模式
- 快速、直接的XSS漏洞检测爬虫 – XSScrapy
- 希尔排序
- RxJava2 实战知识梳理(3) - 优化搜索联想功能
- ubuntu上安装Apache2+ModSecurity及自定义WAF规则
- C++中关于指针初始化和使用NULL的理解
- ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示(优化篇)
- (虚)继承类的内存占用大小
- Linux服务器数据定期同步和备份方式
- Android组件化搭建
- ECMAScript 6 入门简介
- RxJava2 实战知识梳理(2) - 计算一段时间内数据的平均值
- 用了Docker,妈妈再也不担心我的软件安装了 - 基础篇
- 适配器模式(Adapter)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MTO和MaTO MMZDT
- stat 命令家族(3)- 详解 mpstat
- 知识图谱入门(一)
- PHP判断变量内容是什么编码(gbk?utf-8) mb_detect_encoding
- stat 命令家族(4)- 详解 iostat
- PHP将数组存入数据库中的四种方式
- 序列化与json性能评测
- js内存泄漏常见的四种情况(From LeuisKen)
- 「R」Rprofile:R 全局设置
- Jmetal Problem和Problem Set的变量范围
- 简单工厂、工厂方法、抽象工厂的比较与分析
- 用一张组织架构图说清楚类和对象
- 一起来学matlab-matlab学习笔记8 基本绘图命令_3 特殊图形绘制
- 看了这个有趣的例子,你就秒懂多线程同步了
- IDA7.0 配置内核调试,双机调试