LeetCode 2049. 统计最高分的节点数目
题意
一颗完整的树,拆掉一个节点,将原树分成了若干个连通块,将所有连通块大小 连乘作为分数。
n个节点操作一遍 得到分数最大值。
问有多少个节点 能得到分数最大值。
思路
1.计算以各个节点为根的子树大小sum[i]。
2.当拆掉u节点时,它的分数是它所有子节点树的大小的连乘,再乘以 (n-以u为节点的乘积) 除非u是根节点
3.注意连乘 容易超过int范围 要开long long
class Solution {
public:
//计算每个节点分数
int dfs(int u,vector<int>& sum,vector<vector<int>>& e){
if(sum[u])return sum[u];
if(e[u].size()==0)return sum[u]=1;
int res=1;
for(int i=0;i<e[u].size();i++){
res+=dfs(e[u][i],sum,e);
}
return sum[u]=res;
}
int countHighestScoreNodes(vector<int>& p) {
int n=p.size(),ans=0;
vector<int>sum(n,0);//存以i为根子树大小
vector <vector<int>> e(n, vector<int> ()); //存边
//初始化 为每个根节点的子节点
for(int i=0;i<n;i++){
if(p[i]!=-1)e[p[i]].push_back(i);
}
dfs(0,sum,e);
long long res=0;
for(int i=0;i<n;i++){
long long t=1;
for(int j=0;j<e[i].size();j++){//子树
t*=sum[e[i][j]];
}
if(p[i]!=-1)t*=n-sum[i];//根
if(res<t){
ans=1;
res=t;
}
else if(res==t){
ans++;
}
}
return ans;
}
};
比赛中想岔了,因为只看了简单样例,以为乘sum[p[i]]-sum[i]。也没改long long 说明对树题目还是不熟悉