【刷题日记】1161. 最大层内元素和

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

本次刷题日记的第 81 篇,力扣题为:1161. 最大层内元素和

一、题目描述:

题目描述文字较少,看一眼大概知道是要说什么,但是我们需要采取什么样的方式来处理的,咱们继续往下看

二、这道题考察了什么思想?你的思路是什么?

  • 题目给予我们一个基本概念,二叉树的层次,从根节点开始是第 1 层,逐个往下递增 1
  • 题目要求我们找到节点和最大的那一层,并返回层数

分析

我们可以知道,按照题目意思,其实已经非常明确了,需要我们计算每一层的节点和,再逐层去比较,返回节点和最大的那一层的层级数

看到题目的描述,第一反应是会先到二叉树的层序遍历来进行处理,因为确实是有点条件反射了

当然,对于能够使用广度优先算法 BFS 的地方,自然也是可以是深度优先算法 DFS 的方式的,自然,反过来也是成立的,只不过是这两种方式扩展的方向不同,一个是深度优先,一个是广度优先,目的只有一个,那就是遍历完全整棵树

那么我们来模拟一下示例:

根据简图,我们可以清晰的看到每一层是如何入队列,以及 maxSum 和 resLevel 的更新情况,题目相对比较好理解,也比较简单,这演示的是层序遍历,当然如果想用深度优先算法来实现的话也是可以的,动起手来吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

此处需要注意我们使用的是二叉树的层序遍历方式,我们需要计算每一层的最大值,并且挨个比较,分为如下几步:

  • 每一层节点入队列
  • 遍历队列里节点的时候,计算本层节点的数据和
  • 判断本层数据和与 maxSum 比较,若比他大则取而代之
  • 最终返回 maxSum 对应的层级位置

编码如下:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxLevelSum(root *TreeNode) int {
// 使用层序遍历的方式更加容易让人想到
    // 初始化结果最大值的层为 1
    resLevel, maxSum := 1, root.Val
    que := []*TreeNode{root}
    for level := 1; len(que) > 0; level++ {
        tmp := que
        que = nil

        // 开始遍历每一层的节点
        tmpSum := 0
        for _,node := range tmp {
            tmpSum += node.Val
            // 开始将当前节点的子节点加入到 que 中
            if node.Left != nil {
                que = append(que, node.Left)
            }
            if node.Right != nil {
                que = append(que, node.Right)
            }
        }

        // 开始判断当前层的总和与 maxSum 谁大
        if tmpSum > maxSum {
            resLevel = level
            maxSum = tmpSum
        }
    }
    return resLevel
}

四、总结:

本次的解法,使用的是二叉树的层序遍历,BFS,时间复杂度为 O(n) ,因为我们遍历了二叉树的所有节点,这个 n 表示二叉树的节点

空间复杂度也是 O(n) ,因为咱们占用的空间消耗最差的情况是属于 O(n) 级别的

原题地址:1161. 最大层内元素和

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

无法复制加载中的内容

猜你喜欢

转载自juejin.im/post/7126886787326148615