公司裡有 n 名員工,每個員工的 id 都是獨一無二的,編號從 0 到 n - 1。公司的總負責人通過 headid 進行標識。
在 manager 陣列中,每個員工都有乙個直屬負責人,其中 manager[i] 是第 i 名員工的直屬負責人。對於總負責人,manager[headid] = -1。題目保證從屬關係可以用樹結構顯示。
公司總負責人想要向公司所有員工通告一條緊急訊息。他將會首先通知他的直屬下屬們,然後由這些下屬通知他們的下屬,直到所有的員工都得知這條緊急訊息。
第 i 名員工需要 informtime[i] 分鐘來通知它的所有直屬下屬(也就是說在 informtime[i] 分鐘後,他的所有直屬下屬都可以開始傳播這一訊息)。
返回通知所有員工這一緊急訊息所需要的 分鐘數 。
示例 1:
輸入:n = 1, headid = 0, manager = [-1], informtime = [0] 輸出:0示例 2:解釋:公司總負責人是該公司的唯一一名員工。
輸入:n = 6, headid = 2, manager = [2,2,-1,2,2,2], informtime = [0,0,1,0,0,0]示例 3:輸出:1
解釋:id = 2 的員工是公司的總負責人,也是其他所有員工的直屬負責人,他需要 1分鐘來通知所有員工。 上圖顯示了公司員工的樹結構。
輸入:n = 7, headid = 6, manager = [1,2,3,4,5,6,-1], informtime = [0,6,5,4,3,2,1]示例 4:輸出:21
解釋:總負責人 id = 6。他將在 1 分鐘內通知 id = 5 的員工。
id = 5的員工將在 2 分鐘內通知 id = 4 的員工。
id = 4 的員工將在 3 分鐘內通知 id = 3 的員工。
id = 3的員工將在 4 分鐘內通知 id = 2 的員工。
id = 2 的員工將在 5 分鐘內通知 id = 1 的員工。
id = 1的員工將在 6 分鐘內通知 id = 0 的員工。
所需時間 = 1 + 2 + 3 + 4 + 5 + 6 = 21 。
輸入:n = 15, headid = 0, manager = [-1,0,0,1,1,2,2,3,3,4,4,5,5,6,6], informtime = [1,1,1,1,1,1,1,0,0,0,0,0,0,0,0]示例 5:輸出:3
解釋:第一分鐘總負責人通知員工 1 和 2 。 第二分鐘他們將會通知員工 3, 4, 5 和 6 。 第三分鐘他們將會通知剩下的員工。
輸入:n = 4, headid = 2, manager = [3,3,-1,2], informtime = [0,0,162,914]這個題的解題思路很容易想出來,不過如何進行實現就需要再思考一會啦輸出:1076
思路: 查詢每乙個最底層員工收到通知需要的時間,那麼最長的時間就是整個通知需要的時間,所以就可以換算為求無向帶權多叉樹的最大深度
遍歷每個底層員工,即informtime(index)為0的員工
記錄好每乙個節點到根節點的權值,比較大小
為了簡便演算法,新增乙個陣列,用來記錄每乙個節點到達根節點的總權值,這樣如果某幾個員工是同乙個領導,會簡便很多
public
intnumofminutes
(int n,
int headid,
int[
] manager,
int[
] informtime)
arr[index]
= sum;
//否則就更新這個值
ans = math.
max(sum, ans)
;//記錄這個陣列的最大值}}
}return ans;
}
曾經手寫的二叉排序樹的 增&刪&改&查
二叉排序樹
二叉樹的深度計算:
遞迴實現:
public
intcomputetreedepth
(binarytree binarytree)
if(binarytree.lchild == null && binarytree.rchild == null)
int ldepth =
computetreedepth
(binarytree.lchild)+1
;int rdepth =
computetreedepth
(binarytree.rchild)+1
;return math.
max(ldepth, rdepth)
;}
非遞迴實現:
## 廣度優先
public
intcomputetreedepth
(binarytree binarytree)
//將根加入佇列
mvisitlist.
offer
(binarytree)
;while
(!mvisitlist.
isempty()
)if(tmp.rchild != null)}}
return depth;
}
## 深度優先
//深度優先,因為是深度遍歷那肯定是先進後出,採用棧實現,然後遍歷思路是先遍歷當前節點的左子樹,沒有左子樹到情況在遍歷右子樹:
public
intcomputetreedepth
(binarytree binarytree)
//當前節點沒有子樹,直接更新最大深度(訪問到當前節點到深度是棧的深度+1)
depth = math.
max(depth, mvisitlist.
size()
+1);
//此時回溯去找右子樹
while
(!mvisitlist.
isempty()
)//說明當前棧頂節點的右子樹為空,直接出棧,繼續回溯
// 且要更新當前節點,用於記錄當前正在回溯的節點,避免死迴圈回溯
tmp = mvisitlist.
pop();
}}return depth;
}
今天隨機選了3個題都是關於樹結構的,確實,二叉樹在資料結構和演算法中是很常用的,二叉樹的建立\排列\遍歷都是面試必須掌握的哈
我還是抓緊複習樹的知識去啦!
5354 通知所有員工所需的時間
dfs自底向上 class solution def numofminutes self,n int,headid int,manager,informtime int visited false n res 0 for i in manager 曾經經過的,說明計算過 if visited i c...
力扣解題思路 1376 通知所有員工所需的時間
思路 方法1 dfs dfs是最容易想到的,這是遍歷樹結構常用的一種遞迴演算法,用hashmap來儲存這個有向圖結構 也類似於多叉樹 從head節點開始遞迴遍歷他的子節點,相當於計算每一條從head出發到各個葉子節點的time取最大值即可。class solution map map newhash...
SQL練習 1 查詢最晚入職員工的所有資訊
查詢最晚入職員工的所有資訊 create table employees emp no int 11 not null,birth date date not null,first name varchar 14 not null,last name varchar 16 not null,gend...