持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
天堂硅谷·数字经济算法编程大赛
天堂硅谷·数字经济算法编程大赛-力扣
题目有点难,前两题简单,第三题不知道他每天简单的做法。第四题感觉可能是dfs或者是dp,不懂,不会做。
参加的人不多,排222(数字还挺吉利)不知道会不会联系我让我去实习(做梦吧),哈哈哈哈哈
这个女子高中生真厉害,搞不懂这些大佬是咋变成大佬的,真像也变成大佬
题目-03. 重复的彩灯树
有一棵结构为二叉树的圣诞树 root 挂满了彩灯,各节点值表示彩灯的颜色。
如果两棵子树具有 相同的结构 和 相同的彩灯颜色分布,则它们是 重复 的。
请返回这棵树上所有 重复的子树。 注意:
- 对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
示例 1
- 输入: root = [1,3,3,null,2,null,2]
- 输出: [[3,null,2],[2]]
示例 2
- 输入: root = [3,3,2,null,2]
- 输出: [[2]]
示例 3
- 输入: root = [1,3,3,null,2,2]
- 输出: [[2]]
提示
- 树中的结点数在
[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;
}
}
果然时间排名就不高,看了前排大佬做的,思路一模一样,只是用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();
}
}
第一、二题连接如下-题目-01. 化学反应-题目-02. 销售出色区间
3.结束
前两题都不难,基本100题量的同学就可以做出来了,这个题明白业务逻辑也是可以做出来的,基本刷个200题就能达到了,gogogo,刷题刷题,每天一道,三年1000道!!!!