代码能力越来越菜了......

题目链接

这题本来就是一个普普通通的DFS,但我却掉进了坑了,一直在超时,后面看了题解以后才恍然大悟。

我一开始的想法是,dp[i][k]表示第i个节点为根的情况下,含有字符'a'+k的个数。那么从根节点开始dfs,回溯的时候累计一下就行。

我的代码是这么写的:

class Solution {
public:int dp[100005][26];bool bit[100005];vector<vector<int>> tree;vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {memset(dp,0,sizeof(dp));memset(bit,0,sizeof(bit));tree.resize(n);for (auto& e : edges) {tree[e[0]].emplace_back(e[1]);tree[e[1]].emplace_back(e[0]);}dfs(0,labels);vector<int> ans;for(int i=0;i<n;i++){ans.push_back(dp[i][labels[i]-'a']);}return ans;}void dfs(int rt, string labels){dp[rt][labels[rt]-'a']++;bit[rt]=1;for(auto vec:tree[rt]){if(bit[vec]) continue;dfs(vec,labels);for(int i=0;i<26;i++){dp[rt][i]+=dp[vec][i];}}}
};

复杂度为n*26*max(节点的出度)。其实问题就出在我把for(i=0;i<26;i++)这个循环放在了遍历节点这个循环的内部。

解决方法就是利用引用传递,可以将for(i=0;i<26;i++)这个循环放在外面,从而让复杂度降低到n*max(26,max(节点的出度))

class Solution {vector<vector<int>> tree;vector<bool> vis;vector<int> ans;
public:vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {tree.resize(labels.size());vis.resize(labels.size(), false);ans.resize(labels.size());for (auto& e : edges) {tree[e[0]].emplace_back(e[1]);tree[e[1]].emplace_back(e[0]);}vector<int> tmp(26);dfs(0, tmp, labels);return ans;}void dfs(int in, vector<int>& a, string& labels) {if (vis[in]) return; vis[in] = true;vector<int> tmp(26);for (auto& out : tree[in]) dfs(out, tmp, labels);ans[in] = ++tmp[labels[in] - 'a'];for (int i = 0; i < 26; ++i) a[i] += tmp[i];}
};

上面代码的亮点在于处于同一层的节点共用一个tmp数组。

leetcode 5465. 子树中标签相同的节点数相关推荐

  1. leetcode周赛5465. 子树中标签相同的节点数

    leetcode周赛5465. 子树中标签相同的节点数 给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰好有 n - 1 条 edges .树的根节 ...

  2. [leetcode周赛198] 5465. 子树中标签相同的节点数

    给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰好有 n - 1 条 edges .树的根节点为节点 0 ,树上的每一个节点都有一个标签,也就是字符 ...

  3. easyui的tree获取父节点_力扣 1519——子数中标签相同的节点数

    本题主要在于对树这种数据结构的考察,以及深度优先遍历的使用,优化时可以采取空间换时间的策略. 原题 给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰 ...

  4. 如何配置神经网络中的层数和节点数

    向AI转型的程序员都关注了这个号

  5. 【LeetCode 每日一题】1617. 统计子树中城市之间最大距离(hard)

    1617. 统计子树中城市之间最大距离   图论啊,那我先寄为敬.今天是代码搬运工.   题意很好理解啊,就是给你一个图,让你返回所有直径对应的子树的数量.是的没错,是所有直径,你不仅要枚举 1 − ...

  6. LeetCode 1120. 子树的最大平均值(DFS自底向上)

    文章目录 1. 题目 2. 解题 1. 题目 给你一棵二叉树的根节点 root,找出这棵树的 每一棵 子树的 平均值 中的 最大 值. 子树是树中的任意节点和它的所有后代构成的集合. 树的平均值是树中 ...

  7. leetcode探索专题中的初级算法练习题(python代码+解题思路)

    本文记录leetcode探索专题中的初级算法练习题,附python实现代码&解题思路,做题过程不免查阅网络资料,侵删~如有错误,欢迎指正交流! 目录 专题一:数组: 26.从排序数组中删除重复 ...

  8. Div+CSS布局入门教程(五) 页面制作-用好border和clear 附加:1.DIV+CSS设计原则 2.DIV+CSS中标签ul ol li dl dt dd用法

    这一节里面,主要就是想告诉大家如何使用好border和clear这两个属性. 首先,如果你曾用过table制作网页,你就应该知道,如果要在表格中绘制一条虚线该如何做,那需要制作一个很小的图片来填充,其 ...

  9. 数据结构:二叉树的创建,打印前中后序遍历,节点个数,叶子节点数,销毁,第K层中节点的个数,查找值为x的节点

    二叉树遍历:按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次.(采用递归思想) 先序遍历:先遍历根节点,再遍历根节点的左子树,最后遍历根节点的右子树. 中序遍历:先遍历左 ...

最新文章

  1. PHP、Python 竟上榜最慢的现代编程语言
  2. boost::container实现前向迭代的测试程序
  3. Java怎么使用spring定时器_浅析spring定时器的使用
  4. .NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控
  5. LeetCode 625. 最小因式分解(贪心)
  6. 修改goods对ECshop的url路径进行优化
  7. Linux添加授信根证书,linux系统添加根证书 linux证书信任列表
  8. Show Desktop Pro FAQ
  9. SSH网上商城:回首网上商城
  10. 自主编写的新书出版2个月,竟然上了51cto读书频道的动态首页,兴奋中!
  11. linux mysql 建索引_MySQL在创建索引之前一定要想到的事情
  12. [转载] Python将列表转换成字符串及字符串左右中对齐输出问题
  13. Java RESTful Web Service实战(第2版) 2.3 传输格式
  14. 【实践】BiLSTM上的CRF,用命名实体识别任务来解释CRF(1)
  15. 台达PLC,触摸屏程序工程案例 含电气图 台达与伺服变频通讯实例
  16. 接口测试用例设计方法——接口测试用例思路梳理
  17. Xutils使用详解(二)
  18. 一般的java项目后台都有什么技术?
  19. mysql5.6 relay.info_Relay log 导致复制启动失败
  20. 杂项工具WinHex

热门文章

  1. Spring Boot项目实践-员工管理系统 删除 注销 404 (9)
  2. iOS-视频编码技术
  3. Coinbase今日上市,加密市场提前暴涨,行情接下来怎么走?
  4. sigmatube软件破解思路与方向
  5. 【python爬虫】全国大学生创业服务网项目按高校分类查询
  6. 玩转QQ玩一玩分享,让游戏增加新的活力
  7. MATLAB 实现AES加解密
  8. osworkflow,workflowstore
  9. 使用蜻蜓映射实现外网访问内网金蝶软件服务
  10. [译] 源代码映射(Source Map)简介