leetcode5980統計最高分的節點數目
阿新 • • 發佈:2021-10-24
給你一棵根節點為 0 的二叉樹,它總共有 n個節點,節點編號為0到n - 1。同時給你一個下標從0開始的整數陣列parents表示這棵樹,其中parents[i]是節點 i的父節點。由於節點 0是根,所以parents[0] == -1。
一個子樹的 大小為這個子樹內節點的數目。每個節點都有一個與之關聯的分數。求出某個節點分數的方法是,將這個節點和與它相連的邊全部 刪除,剩餘部分是若干個 非空子樹,這個節點的 分數為所有這些子樹 大小的乘積。
請你返回有 最高得分節點的 數目
dfs統計每個結點所在子樹的結點個數cnt, 列舉每個結點,結果就是cnt[l] * cnt[r] * (n - cnt[l] - cnt[r] - 1)
#define N 200005 #define ll long long int #define mod 1e9 + 7 #define lowbit(x) x&(-x) class Solution { public: int cnt[100005]; vector<int> dp[100003]; int dfs(int n){ if(dp[n].size() == 0){ //cnt[n] = 1; return 1; } for(auto x : dp[n]){ cnt[n] += dfs(x); } return cnt[n]; } int countHighestScoreNodes(vector<int>& a) { int n = a.size(); for(int i = 0; i < n; i++) cnt[i] = 1; for(int i = 1; i < n; i++) dp[a[i]].push_back(i); dfs(0); ll ans = 0; map<ll, int> mp; for(int i = 0; i < n; i++){ ll inf = 1, k = n; for(int j = 0; j < dp[i].size(); j++){ inf *= cnt[dp[i][j]]; k -= cnt[dp[i][j]]; } k--; if(k) inf *= k; mp[inf]++; ans = max(ans, inf); } return mp[ans]; } };