【力扣】96. 不同的二叉搜索树 <动态规划>

2023-11-07

【力扣】96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:
在这里插入图片描述
输入:n = 3
输出:5

示例 2:
输入:n = 1
输出:1

提示:
1 <= n <= 19

题解

  • 确定 dp 数组以及下标的含义
    dp[i] : 1到 i 为节点组成的二叉搜索树的个数为 dp[i]
    i 个不同元素节点组成的二叉搜索树的个数为 dp[i]
  • 确定递推公式
    dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量
    元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量
    元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量
    元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量
    有2个元素的搜索树数量就是 dp[2]。有1个元素的搜索树数量就是 dp[1]。
    所以 dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]
    在这里插入图片描述

dp[i] += dp[以 1到i-1 为头结点左子树节点数量] * dp[以 i-(1到i-1) 为头结点右子树节点数量]

所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为 j 为头结点左子树节点数量,i-j 为以 j 为头结点右子树节点数量。

  • dp 数组如何初始化
    dp[0] = 1
  • 确定遍历顺序
    节点数为 i 的状态是依靠 i 之前节点数的状态。
    那么遍历 i 里面每一个数作为头结点的状态,用 j 来遍历
for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= i; j++) {
        dp[i] += dp[j - 1] * dp[i - j];
    }
}
  • 举例推导 dp 数组(打印 dp 数组)
class Solution {
    public int numTrees(int n) {
        //初始化
        int[] dp = new int[n + 1];
        //初始化0个节点和1个节点的情况
        dp[0] = 1;
        // 遍历
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
            	// dp 方程
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【力扣】96. 不同的二叉搜索树 <动态规划> 的相关文章

随机推荐

  • docker部署springboot,并且查看运行日志

    docker部署springboot 默认已经安装好docker 第一步 构建镜像 创建Dockerfile文件 文件内容如下 FROM frolvlad alpine oraclejdk8 slim VOLUME tmp ADD inde
  • 静态代码块、动态代码块、构造方法的优先级

    执行优先级 静态代码块 gt 动态代码块 gt 构造方法 代码案例 特殊情况 静态变量赋值new public class Main2 Main2 System out println hello world private static
  • 【算法】模拟,高精度

    高精度加法 P1601 A B Problem 高精 洛谷 计算机科学教育新生态 luogu com cn 思路就是模拟 值得注意的就是要用字符串类型输入 存进自己的int数组时要倒着存 因为如果是正着存的话 进位会有点trouble 时间
  • 机器学习:隐马尔可夫模型(HMM)

    后续会回来补充代码 1 隐马尔可夫模型 隐马尔可夫模型 Hidden Markov Model HMM 是可用于标注问题的统计学模型 描述由隐藏的马尔可夫链随机生成观测序列的过程 1 1 数学定义 隐马尔可夫模型是关于时序的概率模型 描述由
  • How to Connect Power Switches

    原文链接 https vlsiconceptsforyou blogspot com 2020 05 how to connect power switches html Wednesday May 20 2020 How to Conne
  • Python爱心代码

    效果展示 代码自取 from tkinter import from math import log sin cos pi import random 新建画布尺寸大小 CANVAS WIDTH 640 CANVAS HEIGHT 480
  • GBN,SR,TCP区别

    GBN 回退N go back N 如果某个报文段没有被正确的接收 那么从这个报文段到后面的报文段都要重新发送 返回的ACK采用剋及确认的机制 也就是说如果GBN返回的ACK 3 也就是说3报文段和3 之前的报文段都被正确地接收了 SR 接
  • 基于Vue3实现鼠标按下某个元素进行拖动,实时改变左侧或右侧元素的宽度,以及点击收起或展开的功能

    前言 其原理主要是利用JavaScript中的鼠标事件来控制CSS样式 大致就是监听某个DOM元素的鼠标按下事件 以及按下之后的移动事件和松开事件 在鼠标按下且移动过程中 可实时获得鼠标的X轴坐标的值 通过简单计算 可计算出目标元素的宽度
  • uboot-链接脚本(u-boot.lds)

    学习目标 uboot链接脚本分析 学习内容 学习使用了正点原子的I MX6ULL教程及开发平台 uboot的链接脚本u boot lds u boot map 学习时间 2022 07 17 学习产出 分析uboot的启动流程之前 首先要找
  • npm install 报错 ERR! network ‘proxy‘ config is set properly. See: ‘npm help config‘

    想用npm创建项目 但是突然报了个问题 问题 使用 npm install 初始化项目依赖失败 报错 proxy config is set properly See npm help config npm WARN registry Un
  • 多行同时编辑(idea)

    同时按住 Ctrl Shift Alt 点击要编辑的地方就可以同时编辑了
  • stm32图像识别分类技术,陈老师简单为你阐述一下

    STM32图像分类 前言 可能有的同学会有疑问 STM32 能做图像分类这么复杂的事情吗 嵌入式系统中视觉技术的迅速普及 推动了用于汽车安全 机器视觉和运动分析的超高速成像攻克方案 相应地 通过更壮大的图像传感器和更小的像素体系构造 能够显
  • 学习Java面向对象编程和设计模式最好的5本书

    对于任何一个Java开发人员来说 必须学会面向对象的设计原则和各种设计模式的知识 但有一些关于面向对象设计原则 设计模式和最佳实践的书籍 只有少数几本书能做到真正在讲解这方面内容 设计原则和设计模式 设计原则是基础 设计模式是基于这个基础的
  • OAuth2.0 授权模式,基于HttpClient 实现

    功能代码如下 package com zzg ucas config import java io IOException import org apache http HttpResponse import org apache http
  • TP5.0: 显示错误信息

    在TP5中 我们运行的代码有错误无法执行时 只显示页面错误 而不显示错误信息 对我我来讲是无法接受滴 毕竟我还是个小渣渣 查看了百度 解决方案是 在application config php中找到 我们把false改成true即可 然后我
  • CUDA Samples: heat conduction(模拟热传导)

    以下CUDA sample是分别用C 和CUDA实现的模拟热传导生成的图像 并对其中使用到的CUDA函数进行了解说 code参考了 GPU高性能编程CUDA实战 一书的第七章 各个文件内容如下 funset cpp include funs
  • 【计算机视觉

    文章目录 一 分割 语义相关 12篇 1 1 MeViS A Large scale Benchmark for Video Segmentation with Motion Expressions 1 2 Likelihood Based
  • SCAU-OJ教材习题

    第三章 1 分期还款 加强版 从银行贷款金额为d 准备每月还款额为p 月利率为r 请编写程序输入这三个数值 计算并输出多少个月能够还清贷款 输出时保留1位小数 如果无法还清 请输出 God 计算公式如下 输入格式 三个数 分别为货款金额 每
  • 史上最全的Websocket入门教程

    websocket简介 websocket是什么 答 它是一种网络通信协议 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 为什么需要websocket 疑问 我们已经有了 HTTP 协议 为什么还需要另一个协议
  • 【力扣】96. 不同的二叉搜索树 <动态规划>

    力扣 96 不同的二叉搜索树 给你一个整数 n 求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种 返回满足题意的二叉搜索树的种数 示例 1 输入 n 3 输出 5 示例 2 输入 n 1 输出 1 提示 1 l