• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Golang每日一练(leetDay0105) 最小高度树、戳气球

武飞扬头像
Hann Yang
帮助1

学新通

目录

310. 最小高度树 Minimum Height Trees  🌟🌟

312. 戳气球 Burst Balloons  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C 每日一练 专栏

Java每日一练 专栏


310. 最小高度树 Minimum Height Trees

树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。

给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。

可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高度树 。

请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。

树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。

示例 1:

学新通

输入:n = 4, edges = [[1,0],[1,2],[1,3]]
输出:[1]
解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。

示例 2:

学新通

输入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]
输出:[3,4]

提示:

  • 1 <= n <= 2 * 10^4
  • edges.length == n - 1
  • 0 <= ai, bi < n
  • ai != bi
  • 所有 (ai, bi) 互不相同
  • 给定的输入 保证 是一棵树,并且 不会有重复的边

代码:

  1.  
    package main
  2.  
     
  3.  
    import "fmt"
  4.  
     
  5.  
    func findMinHeightTrees(n int, edges [][]int) []int {
  6.  
    if n == 1 {
  7.  
    return []int{0}
  8.  
    }
  9.  
    //创建邻接列表
  10.  
    edgesmap := make([]map[int]bool, n)
  11.  
    for i := 0; i < n; i {
  12.  
    edgesmap[i] = make(map[int]bool)
  13.  
    }
  14.  
    for _, edge := range edges {
  15.  
    edgesmap[edge[0]][edge[1]] = true
  16.  
    edgesmap[edge[1]][edge[0]] = true
  17.  
    }
  18.  
    // 处理叶节点
  19.  
    leaves := []int{}
  20.  
    for i := 0; i < n; i {
  21.  
    if len(edgesmap[i]) == 1 {
  22.  
    leaves = append(leaves, i)
  23.  
    }
  24.  
    }
  25.  
    // 最小高度的树
  26.  
    for n > 2 {
  27.  
    n -= len(leaves)
  28.  
    newLeaves := []int{}
  29.  
    for _, i := range leaves {
  30.  
    var j int
  31.  
    for j = range edgesmap[i] {
  32.  
    break
  33.  
    }
  34.  
    delete(edgesmap[j], i)
  35.  
    if len(edgesmap[j]) == 1 {
  36.  
    newLeaves = append(newLeaves, j)
  37.  
    }
  38.  
    }
  39.  
    leaves = newLeaves
  40.  
    }
  41.  
     
  42.  
    return leaves
  43.  
    }
  44.  
     
  45.  
    func main() {
  46.  
    n := 4
  47.  
    edges := [][]int{{1, 0}, {1, 2}, {1, 3}}
  48.  
    fmt.Println(findMinHeightTrees(n, edges))
  49.  
     
  50.  
    n = 6
  51.  
    edges = [][]int{{3, 0}, {3, 1}, {3, 2}, {3, 4}, {5, 4}}
  52.  
    fmt.Println(findMinHeightTrees(n, edges))
  53.  
    }
学新通

输出:

[1]

[3 4]

相关:

263. 丑数 Ugly Number I  🌟

264. 丑数 Ugly Number II  🌟🌟


312. 戳气球 Burst Balloons

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。

示例 1:

输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins =  3*1*5        3*5*8      1*3*8    1*8*1 = 167

示例 2:

输入:nums = [1,5]
输出:10

提示:

  • n == nums.length
  • 1 <= n <= 300
  • 0 <= nums[i] <= 100

代码:

  1.  
    package main
  2.  
     
  3.  
    import "fmt"
  4.  
     
  5.  
    func maxCoins(nums []int) int {
  6.  
    n := len(nums)
  7.  
    // 添加两个边界
  8.  
    newNums := make([]int, n 2)
  9.  
    newNums[0], newNums[n 1] = 1, 1
  10.  
    for i := 1; i <= n; i {
  11.  
    newNums[i] = nums[i-1]
  12.  
    }
  13.  
    // 定义dp数组
  14.  
    dp := make([][]int, n 2)
  15.  
    for i := range dp {
  16.  
    dp[i] = make([]int, n 2)
  17.  
    }
  18.  
    // 状态转移
  19.  
    for l := 3; l <= n 2; l { // 区间长度,从3开始
  20.  
    for i := 0; i l-1 <= n 1; i { // 起始点
  21.  
    j := i l - 1 // 结束点
  22.  
    for k := i 1; k < j; k { // 最后被扎破的气球
  23.  
    dp[i][j] = max(dp[i][j], dp[i][k] dp[k][j] newNums[i]*newNums[k]*newNums[j])
  24.  
    }
  25.  
    }
  26.  
    }
  27.  
    return dp[0][n 1]
  28.  
    }
  29.  
     
  30.  
    func max(x, y int) int {
  31.  
    if x > y {
  32.  
    return x
  33.  
    }
  34.  
    return y
  35.  
    }
  36.  
     
  37.  
    func main() {
  38.  
    nums1 := []int{3,1,5,8}
  39.  
    fmt.Println(maxCoins(nums1))
  40.  
     
  41.  
    nums2 := []int{1,5}
  42.  
    fmt.Println(maxCoins(nums2))
  43.  
    }
学新通

输出:

167
10


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

学新通

Rust每日一练 专栏

(2023.5.16~)更新中...

学新通

Golang每日一练 专栏

(2023.3.11~)更新中...

学新通

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

学新通

C/C 每日一练 专栏

(2023.2.18~2023.5.18)暂停更

学新通

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbkie
系列文章
更多 icon
同类精品
更多 icon
继续加载