生活随笔
收集整理的這篇文章主要介紹了
LeetCode 2049. 统计最高分的节点数目(DFS)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
1. 題目
給你一棵根節(jié)點(diǎn)為 0 的 二叉樹 ,它總共有 n 個(gè)節(jié)點(diǎn),節(jié)點(diǎn)編號(hào)為 0 到 n - 1 。
同時(shí)給你一個(gè)下標(biāo)從 0 開始的整數(shù)數(shù)組 parents 表示這棵樹,其中 parents[i] 是節(jié)點(diǎn) i 的父節(jié)點(diǎn)。
由于節(jié)點(diǎn) 0 是根,所以 parents[0] == -1 。
一個(gè)子樹的 大小 為這個(gè)子樹內(nèi)節(jié)點(diǎn)的數(shù)目。
每個(gè)節(jié)點(diǎn)都有一個(gè)與之關(guān)聯(lián)的 分?jǐn)?shù) 。
求出某個(gè)節(jié)點(diǎn)分?jǐn)?shù)的方法是,將這個(gè)節(jié)點(diǎn)和與它相連的邊全部 刪除 ,剩余部分是若干個(gè) 非空 子樹,這個(gè)節(jié)點(diǎn)的 分?jǐn)?shù) 為所有這些子樹 大小的乘積 。
請(qǐng)你返回有 最高得分 節(jié)點(diǎn)的 數(shù)目 。
示例 1:
輸入:parents
= [-1,2,0,2,0]
輸出:
3
解釋:
- 節(jié)點(diǎn)
0 的分?jǐn)?shù)為:
3 * 1 = 3
- 節(jié)點(diǎn)
1 的分?jǐn)?shù)為:
4 = 4
- 節(jié)點(diǎn)
2 的分?jǐn)?shù)為:
1 * 1 * 2 = 2
- 節(jié)點(diǎn)
3 的分?jǐn)?shù)為:
4 = 4
- 節(jié)點(diǎn)
4 的分?jǐn)?shù)為:
4 = 4
最高得分為
4 ,有三個(gè)節(jié)點(diǎn)得分為
4 (分別是節(jié)點(diǎn)
1,
3 和
4 )。
示例 2:
輸入:parents
= [-1,2,0]
輸出:
2
解釋:
- 節(jié)點(diǎn)
0 的分?jǐn)?shù)為:
2 = 2
- 節(jié)點(diǎn)
1 的分?jǐn)?shù)為:
2 = 2
- 節(jié)點(diǎn)
2 的分?jǐn)?shù)為:
1 * 1 = 1
最高分?jǐn)?shù)為
2 ,有兩個(gè)節(jié)點(diǎn)分?jǐn)?shù)為
2 (分別為節(jié)點(diǎn)
0 和
1 )。提示:
n
== parents
.length
2 <= n
<= 10^5
parents
[0] == -1
對(duì)于 i
!= 0 ,有
0 <= parents
[i
] <= n
- 1
parents 表示一棵二叉樹。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-nodes-with-the-highest-score
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 建圖,dfs,自底向上求子樹節(jié)點(diǎn)數(shù)量
- dfs,求取每個(gè)節(jié)點(diǎn)的得分
class Solution {vector
<vector
<int>> g
;vector
<long long> score
;long long ans
= 0, n
;
public:int countHighestScoreNodes(vector
<int>& parents
) {n
= parents
.size();g
.resize(n
);score
.resize(n
);for(int i
= 1; i
< n
; ++i
)g
[parents
[i
]].push_back(i
);vector
<int> node(n
, 0);dfs(0, node
);dfs1(0, node
);int ct
= 0;for(auto s
: score
){if(s
== ans
)ct
++;}return ct
;}int dfs(int x
, vector
<int>& node
){node
[x
]++;for(auto y
: g
[x
])node
[x
] += dfs(y
, node
);return node
[x
];}void dfs1(int x
, vector
<int>& node
){for(auto y
: g
[x
])dfs1(y
, node
);if(g
[x
].size()==0) score
[x
] = n
-1;else if(g
[x
].size()==1){int n1
= node
[g
[x
][0]];score
[x
] = 1LL*n1
*((n
-1-n1
)==0? 1 :(n
-1-n1
));}else{int n1
= node
[g
[x
][0]];int n2
= node
[g
[x
][1]];score
[x
] = 1LL*n1
*n2
*((n
-1-n1
-n2
)==0? 1 : (n
-1-n1
-n2
));}ans
= max(ans
, score
[x
]);}
};
276 ms 132.7 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 2049. 统计最高分的节点数目(DFS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。