​LeetCode解法汇总​979. 在二叉树中分配硬币

news/2024/7/3 2:14:16

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。

在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点。)。

返回使每个结点上只有一枚硬币所需的移动次数。

示例 1:

输入:[3,0,0]
输出:2
解释:从树的根结点开始,我们将一枚硬币移到它的左子结点上,一枚硬币移到它的右子结点上。

示例 2:

输入:[0,3,0]
输出:3
解释:从根结点的左子结点开始,我们将两枚硬币移到根结点上 [移动两次]。然后,我们把一枚硬币从根结点移到右子结点上。

示例 3:

输入:[1,0,2]
输出:2

示例 4:

输入:[1,0,0,null,3]
输出:4

提示:

  1. 1<= N <= 100
  2. 0 <= node.val <= N

解题思路:

* 解题思路:

* 其实这道题和平衡二叉树很像。

* 我们构建两颗树,

* 第一颗树numMap,记录每个节点及其子节点应该有多少个硬币。

* 第二颗树sumMap,记录每个节点及其子节点当前有多少个硬币。

* 每个节点当前具有的,减去应该具有的硬币数量,其差值的绝对值就是每个节点应该送出或者接受的数量。

* 求这个差值的和就是我们想要的结果。

代码:

class Solution979
{
public:
    int getTreeNodeNum(TreeNode *node, std::map<TreeNode *, int> &numMap)
    {
        if (node == nullptr)
        {
            return 0;
        }
        int num = 1;
        num += getTreeNodeNum(node->left, numMap);
        num += getTreeNodeNum(node->right, numMap);
        numMap[node] = num;
        return num;
    }

    int getTreeNodeSum(TreeNode *node, std::map<TreeNode *, int> &sumMap)
    {
        if (node == nullptr)
        {
            return 0;
        }
        int sum = node->val;
        sum += getTreeNodeSum(node->left, sumMap);
        sum += getTreeNodeSum(node->right, sumMap);
        sumMap[node] = sum;
        return sum;
    }

    int distributeCoins(TreeNode *root)
    {
        int sum = 0;
        std::map<TreeNode *, int> numMap;
        std::map<TreeNode *, int> sumMap;
        getTreeNodeNum(root, numMap);
        getTreeNodeSum(root, sumMap);
        // std::cout << "Value: " << sumMap.size() << std::endl;
        int result = 0;
        for (auto it = numMap.begin(); it != numMap.end(); ++it)
        {
            int sum = sumMap[it->first];
            int num = it->second;
            result += abs(sum - num);
        }
        return result;
    }
};


http://lihuaxi.xjx100.cn/news/1343031.html

相关文章

年入100w白帽,教你怎么挖SRC

1 为啥要挖SRC呢&#xff1f; 近年来&#xff0c;各大SRC漏洞奖励不断上提&#xff0c; 单个漏洞可达4.5w&#xff0c;你不心动&#xff1f;&#xff01; 出国游、梦想趴&#xff0c;说走就走&#xff0c;你不羡慕&#xff1f; 年终奖、节日礼拿到手软&#xff0c;这不香&…

Python脚本速查手册(一)

Python脚本速查手册(一) 前言 Python 对于运维工程师来说&#xff0c;是一门必须掌握的技能。Python 是运维工程师的利器&#xff0c;相比于 Bash&#xff0c;它拥有更加完善的生态和支持&#xff0c;你可以使用 Python 更加简单的完成过去在Bash 当中复杂的功能。 同时&#…

笔记本电脑的电池健康:确保长时间使用和优异性能的关键

笔记本电脑已经成为我们日常生活中不可或缺的工具&#xff0c;无论是办公、学习还是娱乐&#xff0c;我们都依赖着它的便携性和高效性能。而在所有的硬件组件中&#xff0c;电池健康被认为是确保长时间使用和良好性能的关键因素之一。一块健康的电池不仅能提供持久的续航时间&a…

“开放合作 共享未来”华秋联手伙伴共创硬件生态,助力物联网硬件加速创新

2023年7月11日&#xff0c;华秋携产品与方案亮相慕尼黑上海电子展&#xff08;electronica China&#xff09;&#xff0c;并与5家生态伙伴签署硬件生态共创战略协议&#xff0c;通过“硬件软件供应链”的合作模式&#xff0c;发挥各自行业优势&#xff0c;共同推动电子产业的创…

Maven —— 项目管理工具

前言 在这篇文章中&#xff0c;荔枝会介绍如何在项目工程中借助Maven的力量来开发&#xff0c;主要涉及Maven的下载安装、环境变量的配置、IDEA中的Maven的路径配置和信息修改以及通过Maven来快速构建项目。希望能对需要配置的小伙伴们有帮助哈哈哈哈~~~ 文章目录 前言 一、初…

vue 页面初始化 数据处理过程

1 mounted 是初始化页面(浏览器刷新也是初始化页面),computed是更新页面数据 浏览器刷新会重新初始化页面。当我们使用 Vue.js 时&#xff0c;也会进行重新初始化&#xff0c; 重新创建 Vue.js 实例&#xff0c;并将原有的数据和方法重新加载到内存中。 这也是为什么在开发 Vu…

使用 SageMaker 对 Whisper 模型进行微调及部署

使用 SageMaker 对 Whisper 模型进行微调及部署 Whisper 作为 OpenAI 最新开源的自动语音识别&#xff08;ASR&#xff09;模型&#xff0c;采用了编码器-解码器&#xff08;encoder- decoder&#xff09;transformer架构&#xff0c;并使用了 68 万小时的从互联网收集的多语言…

【C语言提升】深入了解动态内存管理

目录 一、静态分配和动态分配 二、内存管理函数 1、malloc 申请堆区空间 2、calloc 申请堆区空间 3、free回收堆区空间权限 4、memset内存设置函数 5、realloc内存增减函数 三、内存泄漏&#xff08;了解&#xff09; 一、静态分配和动态分配 1、静态分配 在程序编译…