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. 2019-2020-2 《网络对抗技术》Exp0 环境搭建-Kali Linux 的安装

    2019-2020-2 20175334 环境搭建-Kali Linux 的安装 一.Kali的下载与安装 在Kali官网中下载镜像文件 打开Vmware开始创建新虚拟机 选择镜像文件 选择操作系统 ...

  2. 深入浅出Mybatis系列四-配置详解之typeAliases别名(mybatis源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(三)---配置详解之properties ...

  3. java学习笔记之IO编程—内存流、管道流、随机流

    1.内存操作流 之前学习的IO操作输入和输出都是从文件中来的,当然,也可以将输入和输出的位置设置在内存上,这就需要用到内存操作流,java提供两类内存操作流 字节内存操作流:ByteArrayOutp ...

  4. go-web 获取get/post请求中的请求头和表单数据

    package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r * ...

  5. mysql-使用存储过程创建大批量数据

    参考:https://www.iteye.com/blog/825635381-2161290 场景1.创建1万个table,每个table种插入1条记录 DELIMITER $$ CREATE DA ...

  6. 机器学习作业(二)逻辑回归——Python(numpy)实现

    题目太长啦!文档下载[传送门] 第1题 简述:实现逻辑回归. 此处使用了minimize函数代替Matlab的fminunc函数,参考了该博客[传送门]. import numpy as np imp ...

  7. phpstorm实现分屏展示代码

    第一种 选择你要分屏的页面 [Window]—>[Editor Tabs]—>[Split Vertically]or[Split Horizontally]  第二种 把鼠标箭头放到你想 ...

  8. cursor 把鼠标指针的形状弄成一只伸出食指的手

    <span style="cursor:auto">auto</span><br> <span style="cursor:cr ...

  9. 在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结

    当我们在开发中遇到tab切换,这时候用el的el-tabs感觉很方便 但当我在把代码都写完后,发现一个问题就是页面打开时 虽然我们只能看见当前一个tab页,但是vue会帮你把你写的所有tab页的内容都 ...

  10. mybatis大于等于小于等于的写法

    第一种写法(1): 原符号 < <= > >= & ' " 替换符号 < <= > >= & &apos; " ...