leetcode 5465. 子树中标签相同的节点数
代码能力越来越菜了......
题目链接
这题本来就是一个普普通通的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. 子树中标签相同的节点数相关推荐
- leetcode周赛5465. 子树中标签相同的节点数
leetcode周赛5465. 子树中标签相同的节点数 给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰好有 n - 1 条 edges .树的根节 ...
- [leetcode周赛198] 5465. 子树中标签相同的节点数
给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰好有 n - 1 条 edges .树的根节点为节点 0 ,树上的每一个节点都有一个标签,也就是字符 ...
- easyui的tree获取父节点_力扣 1519——子数中标签相同的节点数
本题主要在于对树这种数据结构的考察,以及深度优先遍历的使用,优化时可以采取空间换时间的策略. 原题 给你一棵树(即,一个连通的无环无向图),这棵树由编号从 0 到 n - 1 的 n 个节点组成,且恰 ...
- 如何配置神经网络中的层数和节点数
向AI转型的程序员都关注了这个号
- 【LeetCode 每日一题】1617. 统计子树中城市之间最大距离(hard)
1617. 统计子树中城市之间最大距离 图论啊,那我先寄为敬.今天是代码搬运工. 题意很好理解啊,就是给你一个图,让你返回所有直径对应的子树的数量.是的没错,是所有直径,你不仅要枚举 1 − ...
- LeetCode 1120. 子树的最大平均值(DFS自底向上)
文章目录 1. 题目 2. 解题 1. 题目 给你一棵二叉树的根节点 root,找出这棵树的 每一棵 子树的 平均值 中的 最大 值. 子树是树中的任意节点和它的所有后代构成的集合. 树的平均值是树中 ...
- leetcode探索专题中的初级算法练习题(python代码+解题思路)
本文记录leetcode探索专题中的初级算法练习题,附python实现代码&解题思路,做题过程不免查阅网络资料,侵删~如有错误,欢迎指正交流! 目录 专题一:数组: 26.从排序数组中删除重复 ...
- Div+CSS布局入门教程(五) 页面制作-用好border和clear 附加:1.DIV+CSS设计原则 2.DIV+CSS中标签ul ol li dl dt dd用法
这一节里面,主要就是想告诉大家如何使用好border和clear这两个属性. 首先,如果你曾用过table制作网页,你就应该知道,如果要在表格中绘制一条虚线该如何做,那需要制作一个很小的图片来填充,其 ...
- 数据结构:二叉树的创建,打印前中后序遍历,节点个数,叶子节点数,销毁,第K层中节点的个数,查找值为x的节点
二叉树遍历:按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次.(采用递归思想) 先序遍历:先遍历根节点,再遍历根节点的左子树,最后遍历根节点的右子树. 中序遍历:先遍历左 ...
最新文章
- PHP、Python 竟上榜最慢的现代编程语言
- boost::container实现前向迭代的测试程序
- Java怎么使用spring定时器_浅析spring定时器的使用
- .NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控
- LeetCode 625. 最小因式分解(贪心)
- 修改goods对ECshop的url路径进行优化
- Linux添加授信根证书,linux系统添加根证书 linux证书信任列表
- Show Desktop Pro FAQ
- SSH网上商城:回首网上商城
- 自主编写的新书出版2个月,竟然上了51cto读书频道的动态首页,兴奋中!
- linux mysql 建索引_MySQL在创建索引之前一定要想到的事情
- [转载] Python将列表转换成字符串及字符串左右中对齐输出问题
- Java RESTful Web Service实战(第2版) 2.3 传输格式
- 【实践】BiLSTM上的CRF,用命名实体识别任务来解释CRF(1)
- 台达PLC,触摸屏程序工程案例 含电气图 台达与伺服变频通讯实例
- 接口测试用例设计方法——接口测试用例思路梳理
- Xutils使用详解(二)
- 一般的java项目后台都有什么技术?
- mysql5.6 relay.info_Relay log 导致复制启动失败
- 杂项工具WinHex