[每日算法 - 華為機試] leetcode690. 員工的重要性
入口
題目描述
給定一個保存員工信息的數據結構,它包含了員工 唯一的 id ,重要度 和 直系下屬的 id 。比如,員工 1 是員工 2 的領導,員工 2 是員工 3 的領導。他們相應的重要度為 15 , 10 , 5 。那么員工 1 的數據結構是 [1, 15, [2]] ,員工 2的 數據結構是 [2, 10, [3]] ,員工 3 的數據結構是 [3, 5, []] 。注意雖然員工 3 也是員工 1 的一個下屬,但是由于 并不是直系 下屬,因此沒有體現在員工 1 的數據結構中。
現在輸入一個公司的所有員工信息,以及單個員工 id ,返回這個員工和他所有下屬的重要度之和。
示例:
輸入:[[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1 輸出:11 解釋: 員工 1 自身的重要度是 5 ,他有兩個直系下屬 2 和 3 ,而且 2 和 3 的重要度均為 3 。因此員工 1 的總重要度是 5 + 3 + 3 = 11 。提示:
- 一個員工最多有一個 直系 領導,但是可以有多個 直系 下屬
- 員工數量不超過 2000 。
當遇到一個問題描述中涉及到多個個體之間存在層級關系,且這些關系可以看作是一個從頂層到底層的結構時,很可能你正在處理一個樹結構問題。例如公司的組織結構、文件系統、家譜等等。
這道題就是一個典型的樹結構問題。員工之間的領導和下屬關系可以看作是一種層級結構,公司的管理層次就像是一棵樹,頂級領導是樹的根節點,而下屬們是樹的分支。要解決這個問題,需要通過遍歷這棵樹,累加每個員工的重要度,從而得到特定員工及其所有下屬的重要度之和。
方法一:深度優先搜索
Java示例
class Solution {
Map<Integer, Employee> map = new HashMap<>(); // 創建一個映射,將員工ID映射到員工對象
public int getImportance(List<Employee> employees, int id) {
// 將員工列表中的員工對象放入映射表中,以便快速查找
for (Employee emp : employees) {
map.put(emp.id, emp);
}
// 調用深度優先搜索函數來計算員工及其下屬員工的總重要性值
return dfs(id);
}
public int dfs(int id) {
Employee emp = map.get(id); // 從映射表中獲取指定ID對應的員工對象
int total = emp.importance; // 初始化總重要性值為員工的重要性值
List<Integer> subs = emp.subordinates; // 獲取員工的下屬員工ID列表
for (int i : subs) {
// 遞歸調用dfs函數來計算下屬員工的總重要性值并累加到總值中
total += dfs(i);
}
// 返回累計的總重要性值
return total;
}
}
復雜度分析
時間復雜度:O(n),其中 n是員工數量。
空間復雜度:O(n),其中 n是員工數量。
方法二:廣度優先搜索
Java示例
class Solution {
public int getImportance(List<Employee> employees, int id) {
// 創建一個映射,將員工的ID映射到對應的員工對象
Map<Integer, Employee> map = new HashMap<>();
int total = 0; // 用于累計重要度
// 將員工列表中的員工對象放入映射中
for (Employee employee : employees) {
map.put(employee.id, employee);
}
// 創建一個隊列,用于廣度優先搜索
Queue<Integer> queue = new LinkedList<>();
queue.offer(id); // 將給定員工的ID加入隊列,作為起始點
// 廣度優先搜索
while (!queue.isEmpty()) {
int curId = queue.poll(); // 彈出隊列中的當前員工ID
Employee emp = map.get(curId); // 獲取當前員工對象
total += emp.importance; // 累加當前員工的重要度
List<Integer> subs = emp.subordinates; // 獲取當前員工的下屬ID列表
// 將當前員工的下屬ID加入隊列,以便后續遍歷
for (int subId : subs) {
queue.offer(subId);
}
}
return total; // 返回累計的總重要度
}
}
復雜度分析
時間復雜度:O(n),其中 n是員工數量。
空間復雜度:O(n),其中 n 是員工數量。哈希表的大小為 n,隊列的大小不超過 n。

https://leetcode.cn/problems/employee-importance/
浙公網安備 33010602011771號