題目:
給定乙個無向、連通的樹。樹中有 n 個標記為 0…n-1 的節點以及 n-1 條邊 。第 i 條邊連線節點 edges[i][0] 和 edges[i][1] 。返回乙個表示節點 i 與其他所有節點距離之和的列表 ans。
思路:
tree[i]:用來記錄第i個結點的孩子節點,及其父節點
depth[i]:用來記錄結點i的層次,根結點位於第0層
count[i]:用來記錄結點i和 結點i的子結點 的總數
answer[0]:根節點到各結點的距離,即根結點所有子結點的層次之和,即depth列表中各元素之和
answer[child]=answer[father]+(n-count[child])-count[child]=answer[father]+n-2*count[child]
(即父結點的answer,加上少走的路,減去多走的路。在父結點的answer 基礎上:少走的路,即當前結點 到 除當前結點自身和當前結點的所有子節點之外的所有結點 都少走了1,總共就是n-count[child]。在父結點的answer 基礎上:多走的路,即當前結點的父節點 到當前結點和當前結點的所有子結點都多走了1,總共就是count[child]
解答:
class
solution
:def
sumofdistancesintree
(self, n:
int, edges: list[list[
int]])
-> list[
int]
: tree =[[
]for _ in
range
(n)]
for father, child in edges:
tree[father]
tree[child]
depth =[0
for _ in
range
(n)]
count =[0
for _ in
range
(n)]
defdfsfordepthandcount
(father, baba)
: count[father]=1
for child in tree[father]
:if child != baba:
depth[child]
= depth[father]+1
dfsfordepthandcount(child, father)
count[father]
+= count[child]
dfsfordepthandcount(0,
-1) answer =[0
for _ in
range
(n)]
answer[0]
=sum
(depth)
defdfsforanswer
(father, baba)
:for child in tree[father]
:if child != baba:
answer[child]
= answer[father]
+ n -
2* count[child]
dfsforanswer(child, father)
dfsforanswer(0,
-1)return answer
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...