力扣【二叉树专题】LCP 44. 开幕式焰火 | 巧用数组去重

195 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 12 天,点击查看活动详情

题目链接

LCP 44. 开幕式焰火 - 力扣(LeetCode)

题目描述

「力扣挑战赛」开幕式开始了,空中绽放了一颗二叉树形的巨型焰火。 给定一棵二叉树 root 代表焰火,节点值表示巨型焰火这一位置的颜色种类。请帮小扣计算巨型焰火有多少种不同的颜色。

测试用例

示例 1:
输入:`root = [1,3,2,1,null,2]`
输出:`3`
解释:焰火中有 3 个不同的颜色,值分别为 123

限制

  • 1 <= 节点个数 <= 1000
  • 1 <= Node.val <= 1000

题目分析

题目需要我们求二叉树中,出现的不同的元素的个数,一个典型的去重题目

一般,涉及到去重的,我们都可以直接上 Set,原理是 Set 内部会用 hashcode 的方式去判断两个元素是否相等。并且,重复的元素,是不会再次存入 Set 内部的

老规矩,声明一个 Set 类型的变量 count,然后对树进行标准的前序遍历,我们将当前节点的值,添加到 count;当整个树遍历完后, count 中元素的个数,就是题目所求


拓展:

通过 Set 我们仅仅知道出现过哪些元素,但我们切换为 Map 结构,key 存放元素的值,val 存放对应元素出现的次数,这样,我们在拿到题目所需的答案的时候,也知道各个元素重复的次数

代码实现

完整的代码实现如下

var numColor = function(root) {
    let count = new Set();
    trave(root);
    return count.size;

    function trave(node) {
        if (node == null) return;
        count.add(node.val);
        trave(node.left);
        trave(node.right);
    }
};

image.png

方法2

对题目的整理,发现可以 Array 来优化,依据是 Set 结构每次存入元素的时候,都需要计算元素的 hashcode 判断是否重复出现过;但用 Array 的话,我们直接初始化一个长度为 1001 的数组 arrarr 中的元素初始值为 0,然后每次遍历树的节点,直接将 arr 对应的下标改为 1 即可。最后对 arr 全部元素求和,完事

var numColor = function(root) {
    let arr = new Array(1000).fill(0);
    trave(root);
    return arr.reduce((a, b) => a + b, 0);

    function trave(node) {
        if (node == null) return;
        arr[node.val] = 1;
        trave(node.left);
        trave(node.right);
    }
};

image.png