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 ...
随机推荐
- BZOJ3473&&BZOJ3277串
BZOJ3473&&BZOJ3277串 题面 自己找去 HINT 对于所有串建立一个广义后缀自动机,对于每一个节点开一个set表示这个节点接受的子串在哪些串里出现过,然后在parent ...
- layui的跳转链接实现分页low
layui.use(['laypage', 'layer'], function(){ var laypage = layui.laypage ,layer = layui.layer; laypag ...
- npm vs yarn
npm yarn npm install yarn npm install react --save yarn add react npm uninstall react --save yarn re ...
- Alice and Hairdresser
Alice's hair is growing by leaps and bounds. Maybe the cause of it is the excess of vitamins, or may ...
- AE接口编程
[转]原文链接:https://malagis.com/arcgis-engine-10-develop-handbook-2-1.html 使用 ArcGIS Engine,也就意味着使用里面的接口 ...
- pandas处理csv,分组统计
需求: /tmp/demo/data下有10个csv文件,按col0和col1分组分别统计col2和col3总和并计算col2和col3的商 # encoding:utf-8 import panda ...
- hadoop搭建HA集群之后不能自动切换namenode
在搭好HA集群之后,想测试一下集群的高可用性,于是先把active的namenode给停掉: hadoop-daemon.sh stop namenode 或者直接kill掉该节点namenode的对 ...
- 动态规划(Dynamic Programming, DP)---- 最大连续子序列和
动态规划(Dynamic Programming, DP)是一种用来解决一类最优化问题的算法思想,简单来使,动态规划是将一个复杂的问题分解成若干个子问题,或者说若干个阶段,下一个阶段通过上一个阶段的结 ...
- [CF603R] Game - 博弈论
[CF603R] Description 给定 \(N \times N\) 的棋盘,两人轮流放棋子.棋子的上下左右四个格子不能再放棋子.不能操作的人负.判断胜负. Solution 用的是很常见的思 ...
- jquery validate验证插件扩展方法(转)
/***************************************************************** jQuery Validate扩展验证方法 (linjq) *** ...