首页 > 其他分享 >2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。 游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡

2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。 游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡

时间:2024-04-17 14:14:48浏览次数:26  
标签:泡泡 right level len 力扣 勇者 left levelInfos levelList

2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。

游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡泡,但需要满足以下规则:

被击破的节点泡泡最多只能有一个子节点泡泡。

如果被击破的节点泡泡有子节点泡泡,那么这个子节点泡泡将会取代被击破泡泡的位置,也就是说,整棵以被击破泡泡为根的子树将会上移。

我们的任务是计算在进行了这样一个击破操作(或选择不击破任何节点)后,这棵二叉泡泡树的最大「层和」是多少。

这里的「层和」是指:在同一高度的所有节点泡泡的分值之和。

输入:root = [6,0,3,null,8]。

输出:11。

答案2024-04-17:

来自左程云

灵捷3.5

大体步骤如下:

1.定义节点结构体 TreeNode 和信息结构体 Info

2.定义全局变量 levelInfosjobs,分别代表每个层级的信息和待处理的节点。

3.定义作业结构体 Job,包含节点的ID和层级。

4.实现 getMaxLayerSum 函数,计算二叉泡泡树的最大层和。

5.在 getMaxLayerSum 函数中,初始化全局变量,计算树的高度。

6.遍历每个层级,计算该层级最后一个节点的分值和。

7.遍历所有待处理的节点,根据节点的ID、层级和左右边界,计算当前层级的节点和下一层级的节点。

8.根据题目描述的规则,更新最大层和的结果。

9.返回最终的最大层和。

总的时间复杂度为 O(N),其中 N 是节点的数量。

总的额外空间复杂度为 O(H),其中 H 是树的高度。

Go完整代码如下:

package main

import (
	"fmt"
	"math"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

type Info struct {
	preSum  int
	left    int
	right   int
	finshId int
}

var levelInfos [][]Info
var jobs []Job

type Job struct {
	nodeId int
	level  int
}

func getMaxLayerSum(root *TreeNode) int {
	levelInfos = nil
	jobs = nil
	process(root, 0)
	height := len(levelInfos) - 1
	ans := math.MinInt64
	for level := 0; level < height; level++ {
		levelList := levelInfos[level]
		ans = max(ans, levelList[len(levelList)-1].preSum)
	}
	for id := 0; id < len(jobs); id++ {
		job := jobs[id]
		nodeId := job.nodeId
		level := job.level
		left := nodeId
		right := nodeId
		curLevelSum := levelInfos[level][left].preSum - levelInfos[level][left-1].preSum
		for ; level < height; level++ {
			if left > right {
				break
			}
			levelList := levelInfos[level]
			if right-left+1 == len(levelList)-1 {
				break
			}
			leftInfo := levelList[left]
			rightInfo := levelList[right]
			nextLeft := leftInfo.left
			nextRight := rightInfo.right
			curLevelAll := levelList[len(levelList)-1].preSum
			if leftInfo.finshId != -1 && leftInfo.finshId == rightInfo.finshId {
				break
			}
			leftInfo.finshId = rightInfo.finshId
			nextLevelSum := 0
			if nextLeft <= nextRight {
				nextLevelSum = levelInfos[level+1][nextRight].preSum - levelInfos[level+1][nextLeft-1].preSum
			}
			ans = max(ans, curLevelAll-curLevelSum+nextLevelSum)
			left = nextLeft
			right = nextRight
			curLevelSum = nextLevelSum
		}
	}
	return ans
}

func process(cur *TreeNode, level int) bool {
	if cur == nil {
		return false
	}
	for level+1 >= len(levelInfos) {
		levelInfos = append(levelInfos, []Info{{0, -1, -1, -1}})
	}
	levelList := levelInfos[level]
	preId := len(levelList) - 1
	levelList = append(levelList, Info{levelList[preId].preSum + cur.Val, len(levelInfos[level+1]), -1, -1})
	levelInfos[level] = levelList
	hasLeft := process(cur.Left, level+1)
	hasRight := process(cur.Right, level+1)
	nodeId := len(levelList) - 1
	if !hasLeft || !hasRight {
		jobs = append(jobs, Job{nodeId, level})
	}
	levelList[nodeId].right = len(levelInfos[level+1]) - 1
	return true
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	root := &TreeNode{
		Val: 6,
		Left: &TreeNode{
			Val:   0,
			Right: &TreeNode{Val: 8},
		},
		Right: &TreeNode{
			Val: 3,
		},
	}
	result := getMaxLayerSum(root)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Info:
    def __init__(self, preSum=0, left=-1, right=-1, finshId=-1):
        self.preSum = preSum
        self.left = left
        self.right = right
        self.finshId = finshId

levelInfos = []
jobs = []

class Job:
    def __init__(self, nodeId, level):
        self.nodeId = nodeId
        self.level = level

def getMaxLayerSum(root):
    global levelInfos, jobs
    levelInfos = []
    jobs = []
    process(root, 0)
    height = len(levelInfos) - 1
    ans = float('-inf')
    for level in range(height):
        levelList = levelInfos[level]
        ans = max(ans, levelList[-1].preSum)
    for id in range(len(jobs)):
        job = jobs[id]
        nodeId = job.nodeId
        level = job.level
        left = nodeId
        right = nodeId
        curLevelSum = levelInfos[level][left].preSum - levelInfos[level][left-1].preSum
        while level < height:
            if left > right:
                break
            levelList = levelInfos[level]
            if right - left + 1 == len(levelList) - 1:
                break
            leftInfo = levelList[left]
            rightInfo = levelList[right]
            nextLeft = leftInfo.left
            nextRight = rightInfo.right
            curLevelAll = levelList[-1].preSum
            if leftInfo.finshId != -1 and leftInfo.finshId == rightInfo.finshId:
                break
            leftInfo.finshId = rightInfo.finshId
            nextLevelSum = 0
            if nextLeft <= nextRight:
                nextLevelSum = levelInfos[level+1][nextRight].preSum - levelInfos[level+1][nextLeft-1].preSum
            ans = max(ans, curLevelAll - curLevelSum + nextLevelSum)
            left = nextLeft
            right = nextRight
            curLevelSum = nextLevelSum
            level += 1
    return ans

def process(cur, level):
    global levelInfos, jobs
    if cur is None:
        return False
    while level + 1 >= len(levelInfos):
        levelInfos.append([Info(0, -1, -1, -1)])
    levelList = levelInfos[level]
    preId = len(levelList) - 1
    levelList.append(Info(levelList[preId].preSum + cur.val, len(levelInfos[level+1]), -1, -1))
    hasLeft = process(cur.left, level+1)
    hasRight = process(cur.right, level+1)
    nodeId = len(levelList) - 1
    if not hasLeft or not hasRight:
        jobs.append(Job(nodeId, level))
    levelList[nodeId].right = len(levelInfos[level+1]) - 1
    return True

root = TreeNode(6)
root.left = TreeNode(0)
root.left.right = TreeNode(8)
root.right = TreeNode(3)

result = getMaxLayerSum(root)
print(result)

在这里插入图片描述

标签:泡泡,right,level,len,力扣,勇者,left,levelInfos,levelList
From: https://www.cnblogs.com/moonfdd/p/18140557

相关文章

  • 力扣经典150题第十六题:接雨水
    目录力扣经典150题第十六题:接雨水1.题目描述2.问题分析3.解题思路4.代码实现5.时间复杂度分析6.应用和扩展7.总结8.参考资料力扣经典150题第十六题:接雨水1.题目描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少......
  • 力扣经典150题第十五题:分发糖果
    目录力扣经典150题第十五题:分发糖果1.题目描述2.问题分析3.解题思路4.代码实现5.时间复杂度分析6.应用和扩展7.总结8.参考资料力扣经典150题第十五题:分发糖果1.题目描述n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下......
  • 2024.4.11力扣每日一题——互质树
    2024.4.11题目来源我的题解方法一深度优先遍历+回溯+存储父节点方法二官方深度优先遍历题目来源力扣每日一题;题序:1766我的题解方法一深度优先遍历+回溯+存储父节点使用一个List存储深度优先遍历过程中的父节点,然后从List的右侧开始遍历,直到与当前节点互质......
  • 从理论到实践:01背包问题在分割等和子集中的应用(力扣416)
    文章目录题目题解一、思路二、解题方法三、Code总结在昨天的文章(传送门)中,我们从理论对01背包问题进行了基础详细的讲解,从二维数组到一维数组进行优化,今天我们用实际题目来运用一下01背包问题的动态规划,要使用01背包问题中的一维dp数组解题,如果对这个不清楚的话,可以......
  • 力扣78 子集 Java版本
    文章目录题目描述代码注意题目描述给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2......
  • 力扣51 N皇后 Java版本
    文章目录题目描述代码题目描述按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的n皇后问题的解决方案。每......
  • 力扣经典150题第十三题:除自身以外数组的乘积
    目录力扣经典150题第十三题:除自身以外数组的乘积1.简介2.问题分析3.解题思路方法一:左右乘积列表方法二:优化空间复杂度4.代码实现5.时间复杂度分析6.应用和扩展7.总结8.参考资料力扣经典150题第十三题:除自身以外数组的乘积1.简介本文介绍如何设计一个算......
  • Offer必备算法23_两个数组dp_八道力扣题详解(由易到难)
    目录①力扣1143.最长公共子序列解析代码②力扣1035.不相交的线解析代码③力扣115.不同的子序列解析代码④力扣44.通配符匹配解析代码⑤力扣10.正则表达式匹配解析代码⑥力扣97.交错字符串解析代码⑦力扣712.两个字符串的最小ASCII删除和解析代码⑧力扣71......
  • 【每周例题】力扣 C++ 移除元素
    移除元素题目移除元素 思路分析1.涉及到容器,那么就很直接的想法,遍历容器,找出与val相同的数,移除,然后利用函数输出长度与移除后的数组2.移除部分我们使用指针去处理,用指针遍历数组,符合移除条件的利用erase函数移除注:这里使用到了一个万能头文件,参加蓝桥杯的同学可以试试运用......
  • 螺旋矩阵II(力扣59)
    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn 正方形矩阵 matrix 。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]提示:1<=n<=20解题思路:明白怎么循环输出,并且每次循环的边界在......