首页 > 其他分享 >96. 不同的二叉搜索树 && 343. 整数拆分 Golang实现

96. 不同的二叉搜索树 && 343. 整数拆分 Golang实现

时间:2025-01-06 20:54:50浏览次数:1  
标签:拆分 int 二叉 Golang 搜索 && 343 节点 dp

这两个题目的分析思路是十分类似的。都是进行一个拆分。

1.不同的二叉搜索树 题目描述:

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

思路分析:

动态规划分析:

  1. 确定状态:
    令dp[i]表示以1到i为节点值的二叉搜索树的个数。
    初始状态:显然当i = 0时,空树也是一种有效的二叉搜索树,dp[0] = 1。当i = 1时,只有一个节点,dp[1] = 1。
  2. 状态转移方程:
    对于dp[i],我们可以通过选择一个数字作为根节点来构造二叉搜索树。我们可以选择1到i中的任意一个数字作为根节点。假设我们选择了数字k作为根节点,那么:

左子树:其节点值在[1, k-1]之间,左子树可以构造dp[k-1]个不同的树。
右子树:其节点值在[k+1, i]之间,右子树可以构造dp[i-k]个不同的树。
因此,对于每个k(根节点),总的树的个数是左子树树的个数与右子树树的个数的乘积。对于所有k的选择(从1到i),我们将这些结果累加。

综上,状态转移方程为:
image
这里,dp[k-1]表示k左边的树的个数,dp[i-k]表示k右边的树的个数。因为左子树不动,右子树的任何一种情况都对应一个新的BST,所以用乘法。

  1. 时间复杂度:
    对于每个i,我们需要计算dp[i],而每个dp[i]需要遍历k从1到i,进行dp[k-1] * dp[i-k]的累加,因此时间复杂度为O(n^2)。
  2. 空间复杂度:
    我们只需要一个数组dp来保存从0到n的结果,因此空间复杂度为O(n)。
点击查看代码
func numTrees(n int) int {
    dp := make([]int, n+1)
    dp[0] = 1 // 空树有 1 种
    dp[1] = 1 // 只有一个节点的树也有 1 种
    //dp[2] = 2 // 2 个节点可以有 2 种不同的二叉搜索树

    // 计算 dp[i],表示有 i 个节点时的不同 BST 数量
    for i := 2; i <= n; i++ {
        for j := 1; j <= i; j++ {
            dp[i] += dp[j-1] * dp[i-j]
        }
    }

    return dp[n]
}

整数拆分 2.题目描述

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:

输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:

输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

思路分析

  1. 确定状态
    令 \(dp[i]\) 表示将整数\(i\)拆分成至少两个正整数后,这些数的最大乘积。
    我们的目标是求出 $dp[n] $。
  2. 状态转移方程
    考虑整数 \(i\)的一种拆分方法:将其分为两个部分 \(j\)和 \(i-j\), 其中 \(1≤j<i\)。

对于这种拆分:

  • j 的选择直接影响结果。
  • 对于 i−j,可以选择进一步拆分,或者直接保留。
    因此:
    image

image

点击查看代码
func integerBreak(n int) int {
    dp := make([]int, n+1)

    // 初始化基本情况
    dp[1] = 1 // 1 没有拆分的可能,最大乘积是 1
    dp[2]=1
    for i := 3; i <= n; i++ {
        for j := 1; j < i; j++ {
            // dp[j]是拆分j后的最大乘积,i-j是剩下的部分
            // 需要考虑i-j本身是否可以拆分,取最大的结果
            dp[i] = max(dp[i], j*(i-j), dp[j]*(i-j))
        }
    }

    return dp[n]
}

标签:拆分,int,二叉,Golang,搜索,&&,343,节点,dp
From: https://www.cnblogs.com/CharlseGo/p/18656274

相关文章

  • xing-zr/gowatermark golang 实现图片文字水印
    xing-zr/gowatermark是一个基于go语言开发的水印工具,可以添加图片和文字水印。安装goget-ugithub.com/xing-zr/gowatermark使用添加图片水印//相关配置config:=gowatermark.ImageWatermarkConfig{ OriginImagePath:"./origin.jpg",//水印底图图片路......
  • 字节二面:你怎么理解信道是golang中的顶级公民
    1.信道是golang中的顶级公民goroutine结合信道channel是golang中实现并发编程的标配。信道给出了一种不同于传统共享内存并发通信的新思路,以一种通道复制的思想解耦了并发编程的各个参与方。信道分为两种:无缓冲和有缓冲信道(先入先出)。分别用于goroutine同步和异步生产消费:......
  • GoLang 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)
    开发工具推荐:GoLang安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程GoLang补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!GoLang是JetBrains公司推出的一款功能强大的GO语言集成开发环境(IDE),凭借其丰富的......
  • golang自带的死锁检测并非银弹
    网上总是能看到有人说go自带了死锁检测,只要有死锁发生runtime就能检测到并及时报错退出,因此go不会被死锁问题困扰。这说明了口口相传知识的有效性是日常值得怀疑的,同时也再一次证明了没有银弹这句话的含金量。这个说法的杀伤力在于它虽然不对,但也不是全错,真真假假很容易让人失去......
  • 可能是GitHub star星最多的Golang Web框架-Gin初识
    对比目前主流GolangWeb框架对比名称描述star数量GinGin是用Go(Golang)编写的HTTPWeb框架。它具有类似Martini的API,性能要好得多-速度提高了40倍。79.6kFiber用Go编写的受Express启发的Web框架34.4kBeegobeego是一个用于Go编程语言的......
  • delphi djson 类与JSON 互转,与 Java、Golang 一致写法
    前因为什么要开发这个JSON库?原因是delphi官方的json既没有处理null(也叫零值)的问题;举例说明吧:开发者往往需要类与JSON之间进行序列化和反序列化;接下来我们举个例子:Person{id:Int64;//IDname:string;//姓名desc:string;//描述}这样一个类在不......
  • 基于Golang的网络安全靶场设计与实现
    摘要伴随着网络信息技术的发展,各类信息安全问题频繁出现,每天都有大量的网络攻击。针对这一问题,未知攻,焉知防。因此急需一种可以用来模拟和复现网络攻击的靶场,在这个靶场中让安全人员第一时间掌握这种攻击技术,并找到到与其对应的防御手段减少遭受网络攻击对人们带来隐私风......
  • Golang技术在机器学习中使用的库和工具
    AI编程助手AI免费问答首页课程路径文章PHP培训精品课下载最新更新技术文章>后端开发>GolangGolang技术在机器学习中使用的库和工具WBOY2024-05-0821:42965浏览原创go语言中适用于机器学习的库和工具包括:tensorflow:流行的机器学习库,提供构建、训练和部署模型的......
  • 【记录一个问题】prefetch 指令在golang中未见到明显效果
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯偶尔了解到DPDK的代码中,使用prefetch指令可能让包处理速度加快10%~15%.尝试在golang中引入prefetch指令,但是未简单明显的加速效果。先说结论:1如果数据......
  • Golang微服务-protobuf
    protobufgRPC是一款语言中立、平台中立、开源的远程过程调用系统,gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml,json,protobuf等gRPC默认使用protocolbuff......