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. 不同的二叉搜索树的更多相关文章

  1. 95. 不同的二叉搜索树 II

    95. 不同的二叉搜索树 II 题意 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 解题思路 这道题目是基于不同的二叉搜索树进行改进的: 对于连续整数序列[left, ri ...

  2. Java实现 LeetCode 95 不同的二叉搜索树 II(二)

    95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...

  3. Leetcode:96. 不同的二叉搜索树

    Leetcode:96. 不同的二叉搜索树 Leetcode:96. 不同的二叉搜索树 题目在链接中,点进去看看吧! 先介绍一个名词:卡特兰数 卡特兰数 卡特兰数Cn满足以下递推关系: \[ C_{n ...

  4. 不同的二叉搜索树&II

    不同的二叉搜索树 只要求个数,递推根节点分割左右子树即可 class Solution { public int numTrees(int n) { int []dp=new int[n+1]; fo ...

  5. Java实现 LeetCode 96 不同的二叉搜索树

    96. 不同的二叉搜索树 给定一个整数 n,求以 1 - n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 ...

  6. LeetCode-095-不同的二叉搜索树 II

    不同的二叉搜索树 II 题目描述:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 .可以按 任意顺序 返回答案. 二叉搜索树(Binary ...

  7. lintcode:搜索二维矩阵II

    题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...

  8. LintCode-38.搜索二维矩阵 II

    搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复 ...

  9. Leetcode 240.搜索二维矩阵II

    搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ...

  10. leetcode-240搜索二维矩阵II

    搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...

随机推荐

  1. ECMAScript基本语法——⑤运算符 三元运算符

    ?: 简化ifelse的操作

  2. k8s service的四种类型

    ClusterIp 默认类型,每个Node分配一个集群内部的Ip,内部可以互相访问,外部无法访问集群内部. NodePort 基于ClusterIp,另外在每个Node上开放一个端口,可以从所有的位置 ...

  3. [tensorflow] tf.gather使用方法

    tf.gather:用一个一维的索引数组,将张量中对应索引的向量提取出来 import tensorflow as tf a = tf.Variable([[1,2,3,4,5], [6,7,8,9, ...

  4. Quartz.NET 2.x教程

    第1课:使用Quartz第2课:工作和触发器第3课:关于工作和JobDetails的更多信息第4课:有关触发器的更多信息第5课:SimpleTriggers第6课:CronTriggers第7课:Tr ...

  5. [P5555] 秩序魔咒 - 回文自动机,DFS

    #include <bits/stdc++.h> #define Sigma 30 #define MAXN 500010 #define int long long using name ...

  6. 161.内置User模型的基本使用

    User模型 user模型是这个框架的核心部分,他的完整路径是在django.contrib.auth.models.User.对User对象做一个简单的了解. 字段: 内置的User模型有以下字段: ...

  7. C++-hihoCode1545-小Hi和小Ho的对弈游戏[树上Nim]

    #include <set> #include <map> #include <cmath> #include <queue> #include < ...

  8. windows下pycharm输入法跟随设置

    参考网址:http://www.itdaan.com/blog/2018/05/20/90e64dae077f8ad7fa70bc9c3c8ab422.html

  9. [HAOI2016] 找相同字符 - 后缀数组,单调栈

    [HAOI2016] 找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. \(n,m \l ...

  10. 参考 ZTree 加载大数据量。加载慢问题解析

    参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...