1. 程式人生 > 其它 >leetcode5980統計最高分的節點數目

leetcode5980統計最高分的節點數目

給你一棵根節點為 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];
    }
};