[杨小白]_leetcode_天堂硅谷·数字经济算法编程大赛-第三题

99 阅读2分钟

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

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

天堂硅谷·数字经济算法编程大赛

天堂硅谷·数字经济算法编程大赛-力扣

题目有点难,前两题简单,第三题不知道他每天简单的做法。第四题感觉可能是dfs或者是dp,不懂,不会做。

参加的人不多,排222(数字还挺吉利)不知道会不会联系我让我去实习(做梦吧),哈哈哈哈哈

image.png

这个女子高中生真厉害,搞不懂这些大佬是咋变成大佬的,真像也变成大佬

题目-03. 重复的彩灯树

有一棵结构为二叉树的圣诞树 root 挂满了彩灯,各节点值表示彩灯的颜色。

如果两棵子树具有 相同的结构 和 相同的彩灯颜色分布,则它们是 重复 的。

请返回这棵树上所有 重复的子树。 注意:

  • 对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

示例 1

  • 输入: root = [1,3,3,null,2,null,2]
  • 输出: [[3,null,2],[2]]

image.png

示例 2

  • 输入: root = [3,3,2,null,2]
  • 输出: [[2]]

image.png

示例 3

  • 输入: root = [1,3,3,null,2,2]
  • 输出: [[2]]

image.png

提示

  • 树中的结点数在[1,6000]范围内。
  • -200 <= Node.val <= 200

代码

这个题虽然我做出来了,但是其实没太理解到底咋回事。

我就new了一个map,遍历了每一个节点,将其中序遍历都放入了map中。

结果发现中序遍历不能确定唯一的树形结构,就只能再加入L和R作为标识符,来记录。

没想到就通过了。

算是瞎猫碰到死耗子吧。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    HashMap<List<String>, Integer> map = new HashMap<>();
    List<TreeNode> res = new ArrayList<>();

    public List<TreeNode> lightDistribution(TreeNode root) {
        dfs(root);
        return res;
    }

    public ArrayList<String> dfs(TreeNode root) {
        if (root == null) return null;
        ArrayList<String> arrayList = new ArrayList<>();
        if (root.left != null) {
            ArrayList<String> dfs = dfs(root.left);
            if (dfs != null && !dfs.isEmpty()) {
                arrayList.add("L");
                arrayList.addAll(dfs);
            }
        }
        arrayList.add(root.val + "");
        if (root.right != null) {
            ArrayList<String> dfs = dfs(root.right);
            if (dfs != null && !dfs.isEmpty()) {
                arrayList.add("R");
                arrayList.addAll(dfs);
            }
        }
        Integer orDefault = map.getOrDefault(arrayList, 0);
        if (orDefault == 1) {
            res.add(root);
        }
        map.put(arrayList, orDefault + 1);

        return arrayList;
    }
}

image.png

果然时间排名就不高,看了前排大佬做的,思路一模一样,只是用stringbuffer来做的相加。

优化

尝试了一下,果然快了,代码量也少了很多

class Solution {
    HashMap<String, Integer> map = new HashMap<>();
    List<TreeNode> res = new ArrayList<>();

    public List<TreeNode> lightDistribution(TreeNode root) {
        dfs(root);
        return res;
    }

    public String dfs(TreeNode root) {
        if (root == null) {
            return "";
        }
         StringBuffer sb = new StringBuffer();
        sb.append("L").append(dfs((root.left))).append(root.val).append("R").append(dfs(root.right));
        Integer orDefault = map.getOrDefault(sb.toString(), 0);
        if (orDefault == 1) {
            res.add(root);
        }
        map.put(sb.toString(), orDefault + 1);
        return sb.toString();
    }
}

image.png

第一、二题连接如下-题目-01. 化学反应-题目-02. 销售出色区间

3.结束

前两题都不难,基本100题量的同学就可以做出来了,这个题明白业务逻辑也是可以做出来的,基本刷个200题就能达到了,gogogo,刷题刷题,每天一道,三年1000道!!!!