此博客鏈接:
員工的重要性
題目鏈接:https://leetcode-cn.com/problems/employee-importance/
給定一個保存員工信息的數據結構,它包含了員工唯一的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:
輸入: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
輸出: 11
解釋:
員工1自身的重要度是5,他有兩個直系下屬2和3,而且2和3的重要度均為3。因此員工1的總重要度是 5 + 3 + 3 = 11。
注意:
一個員工最多有一個直系領導,但是可以有多個直系下屬
員工數量不超過2000。
題解:
思路:看完題目,我以為是求直系下屬的重要性,並且示例也都是只有直系下屬,沒有下屬的下屬,這。。。然后我一頓操作,看着直接按照一維算的。而且取值也不對。
一開始我是這樣寫的:
后來改了一波,發現自己真是啥也不會啊,真是菜啊,下面代碼是意向天開,自認為題目給的Id是按照順序的,但是,不現實。
錯誤2代碼
class Solution { public int getImportance(List<Employee> employees, int id) { if(employees[id].subordinates==null) return employees[id].importance; int len=employees[id].subordinates.size(); int sum=employees[id].importance; for(int i=0;i<len;i++) { sum=sum+employees[employees[id].subordinates(i)].importance; } return sum; } }
對上面代碼進行修改,因為題目給的員工的id不一定是按照順序給的,所以我們需要遍歷List,取List中的id和給的id做比較,然后再訪問下屬。
重新整理一下思路:huangfei
本題是讓求重要性,那么一個老板可以有好多下屬,下屬可能還有下屬,這些都要算重要性。
首先,我們先找到給的id的員工,這個員工可能有下屬,找這個員工的下屬,找到下屬后,下屬可能還存在下屬,直到找到最后一個員工沒有下屬為止,把所有員工的重要性加載一起,就是題目所求的。
這里特別像樹的結構,一個節點下面存在孩子,孩子可能還存在孩子,遍歷到孩子節點,把所有節點的重要性全加一起。這里我采用層次遍歷,遍歷員工的Id,進隊列,在節點出隊列時,把節點的重要性加起來,並把當前節點的下屬進隊列。
class Solution { public int getImportance(List<Employee> employees, int id) { Queue <Integer> queue=new LinkedList(); int result=0; for(Employee e:employees) { if(e.id==id) { queue.add(id); } } while(!queue.isEmpty()){ int len=queue.size(); for(int i=0;i<len;i++) { int temp=queue.poll(); for(Employee e:employees) { if(e.id==temp) { result=result+e.importance; for(Integer num:e.subordinates) { queue.add(num); } break; } } } } return result; } }
哈哈,雖然寫的爛,但是好歹ac了。