演算法練習 通知所有員工所需的時間

2021-10-04 23:01:48 字數 3645 閱讀 2614

公司裡有 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]

輸出:1

解釋:id = 2 的員工是公司的總負責人,也是其他所有員工的直屬負責人,他需要 1分鐘來通知所有員工。 上圖顯示了公司員工的樹結構。

示例 3:

輸入:n = 7, headid = 6, manager = [1,2,3,4,5,6,-1], informtime = [0,6,5,4,3,2,1]

輸出: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 。

示例 4:

輸入: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]

輸出:3

解釋:第一分鐘總負責人通知員工 1 和 2 。 第二分鐘他們將會通知員工 3, 4, 5 和 6 。 第三分鐘他們將會通知剩下的員工。

示例 5:

輸入: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...