95. 不同的二叉搜索树 II、96. 不同的二叉搜索树
95
Tg:递归
这题不能算DP吧,就是递归
一个问题:每次的树都要新建,不能共用一个根节点,否则下次遍历对根左右子树的改动会把已经放进结果数组中的树改掉。。
class Solution:
def generateTrees(self, n: int):
def func(m,n):
#[m,n]闭区间
res=[] if m<=n else[None]
for i in range(m,n+1):
print(i)
left_tree=func(m,i-1)
right_tree=func(i+1,n)
for le in left_tree:
for ri in right_tree:
#必须在这里新建节点,因为每次循环生成的树
#都不一样,不能共用根节点,这样会导致res之前导入
#的树因为之后的遍历发生改动
root=TreeNode(i)
root.left=le
root.right=ri
res.append(root)
return res
return func(1,n) if n else []
96
Tg:Dp
这题和上题类似,但上题要给出所有树的解集,而本题只需要算树的个数,如果直接把上一题代码搬过来加个计数的话会超时,因为1.不需要真的去建立节点和树,只需要算数。2.举例对[1,4]和[5,8]建树,在上一题中这两者完全是不同的,因为树结构不一样,是两棵不同的树。但这题中这两段序列分别建树的个数是一样的,即在96中只要区间长度一样,建立树的数量就一样。
反例(我一开始写的),没用DP。还是按照上一题的思路,对同样区间长度的不同区间分开处理的,加入字典。虽然省略了建树的过程,但还是浪费了时间。
class Solution:
def numTrees(self, n: int) -> int:
dic={}
def func(m,n):
res=0 #当前[m,n]闭区间树的数量
if m>=n:
return 1 #None节点也算1个
for i in range(m,n+1):
#i做根
left=dic[(m,i-1)]if (m,i-1) in dic else func(m,i-1)
right=dic[(i+1,n)]if (i+1,n) in dic else func(i+1,n)
res+=left*right
dic[(m,n)]=res
return res
return func(1,n) if n else 0
官方题解,完全的DP。G(n)为长度n的区间的树数量,外层循环区间长度i为2到n,内层循环根的位置1到i,左子树的G值乘右子树的G值就是当前根情况下的树数量。
class Solution:
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
G = [0]*(n+1)
G[0], G[1] = 1, 1
for i in range(2, n+1):
for j in range(1, i+1):
G[i] += G[j-1] * G[i-j]
return G[n]
C++的,建立map,对于长度相同的序列只算一次。
class Solution {
public:
int numTrees(int n) {
if(n==0){
return 0;
}
map<int,int> dic;
dic[0]=dic[1]=1;
func(n,dic);
return dic[n];
}
void func(int n,map<int,int>& dic){
if(dic[n]!=0){
return;
}
for(int i=1;i<=n;++i){
if(dic[i-1]==0){
func(i-1,dic);
}
if(dic[n-i]==0){
func(n-i,dic);
}
dic[n]+=dic[i-1]*dic[n-i];
}
}
};
95. 不同的二叉搜索树 II、96. 不同的二叉搜索树的更多相关文章
- 95. 不同的二叉搜索树 II
95. 不同的二叉搜索树 II 题意 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 解题思路 这道题目是基于不同的二叉搜索树进行改进的: 对于连续整数序列[left, ri ...
- Java实现 LeetCode 95 不同的二叉搜索树 II(二)
95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...
- Leetcode:96. 不同的二叉搜索树
Leetcode:96. 不同的二叉搜索树 Leetcode:96. 不同的二叉搜索树 题目在链接中,点进去看看吧! 先介绍一个名词:卡特兰数 卡特兰数 卡特兰数Cn满足以下递推关系: \[ C_{n ...
- 不同的二叉搜索树&II
不同的二叉搜索树 只要求个数,递推根节点分割左右子树即可 class Solution { public int numTrees(int n) { int []dp=new int[n+1]; fo ...
- Java实现 LeetCode 96 不同的二叉搜索树
96. 不同的二叉搜索树 给定一个整数 n,求以 1 - n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 ...
- LeetCode-095-不同的二叉搜索树 II
不同的二叉搜索树 II 题目描述:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 .可以按 任意顺序 返回答案. 二叉搜索树(Binary ...
- lintcode:搜索二维矩阵II
题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...
- LintCode-38.搜索二维矩阵 II
搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复 ...
- Leetcode 240.搜索二维矩阵II
搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ...
- leetcode-240搜索二维矩阵II
搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...
随机推荐
- PGET,一个简单、易用的并行获取数据框架
使用场景 当我们的服务收到一个请求后,需要大量调用下游服务获取业务数据,然后对数据进行转换.计算后,响应给请求方. 如果我们采用串行获取下游数据,势必会增加响应时长,降低接口的qps.如果是并行获取下 ...
- “公文流转系统 v1.0”
1.项目需求: 河北金力集团是我省机械加工的龙头企业,主要从事矿山机械制造及各种机械零部件加工.企业有3个厂区,主厂区位于省高新技术开发区,3个分厂分别在保定.邢台和唐山.为增加企业的核心竞争力和加强 ...
- mybatis第一天02
mybatis第二天02 1.映射文件之输入输出映射 1.1映射文件之输入映射类型(parameterType) 1.1.1简单类型 当parameterType为简单类型时,我们只需要直接填写“in ...
- Notepad++ 个人洁癖
插件: JSON Viewer 可以以树的形式查看JSON,同时可以格式化JSON,增加缩进. NppExport 可以高亮复制 下载地址: https://github.com/chcg/NPP_E ...
- (转)classload和class.forname()区别
转自:http://carl-java.iteye.com/blog/978680 java中class.forName和classLoader都可用来对类进行加载.前者除了将类的.class文件加载 ...
- python面试的100题(14)
32.请写出一个函数满足以下条件 该函数的输入是一个仅包含数字的list,输出一个新的list,其中每一个元素要满足以下条件: 1.该元素是偶数 2.该元素在原list中是在偶数的位置(index是偶 ...
- docker在windows下和linux下网络底层的一些区别
windows和linux下的docker运行时的网络结构是有区别的 a.windows下,默认使用Hyper-v创建一个linux虚拟机,承载docker.所以从外向内的路径为: windows - ...
- OpenCV3.0 + VS2015出现“ACCESS_MASK不明确”错误
问题:Vs 使用openCV 3.0+ 出错error C2872: “ACCESS_MASK”: 不明确的符号 环境: 系统:Win7 环境:VS2015 64bit 原因: 是因为我项目中的其中一 ...
- Eclipse项目转到MyEclipse中出错
原因如下. JDK的编译版本和JRE的运行版本不一致导致了这个问题. 在MyEclipse中,对项目进行Build path 逐一设置即可. 还有关于类型转换的问题,由于JDK版本的不一致,下载下来的 ...
- altair package and altair_viewer
pip install altair pip install altair_viewer Altair is a declarative statistical visualization libra ...