Java

  • import java.util.*;
    
    /**
    
     You are given a data structure of employee information, which includes the employee's unique id, his importance value and his direct subordinates' id.
    
     For example, employee 1 is the leader of employee 2, and employee 2 is the leader of employee 3. They have importance value 15, 10 and 5, respectively. Then employee 1 has a data structure like [1, 15, [2]], and employee 2 has [2, 10, [3]], and employee 3 has [3, 5, []]. Note that although employee 3 is also a subordinate of employee 1, the relationship is not direct.
    
     Now given the employee information of a company, and an employee id, you need to return the total importance value of this employee and all his subordinates.
    
     Example 1:
     Input: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
     Output: 11
     Explanation:
     Employee 1 has importance value 5, and he has two direct subordinates: employee 2 and employee 3. They both have importance value 3. So the total importance value of employee 1 is 5 + 3 + 3 = 11.
     Note:
     One employee has at most one direct leader and may have several subordinates.
     The maximum number of employees won't exceed 2000.
    
     */
    
    public class Employee_Importance {
    
        public static void main(String[] args) {
            Employee_Importance out = new Employee_Importance();
            Solution s = out.new Solution();
    
            List<Employee> list = new ArrayList<>();
            System.out.println(s.getImportance(list, 1));
        }
    
        class Solution {
            public int getImportance(List<Employee> employees, int id) {
    
                // find the employee with this id
                Employee target = null;
                HashMap<Integer, Employee> hm = new HashMap<>();
                for (Employee each: employees) {
                    if (each.id == id) {
                        target = each;
                    }
    
                    // setup a lookup from id to actual Employee object
                    hm.put(each.id, each);
                }
    
                if (target == null) {
                    return -1;
                    // throw exception this id invalid
                }
    
                int total = 0;
                Queue<Employee> q = new LinkedList<>();
                q.offer(target);
                while (!q.isEmpty()) {
                    Employee current = q.poll();
                    total += current.importance;
    
                    // worried about circle-reporting, reporting to self
                    for (int eachId: current.subordinates) {
                        q.offer(hm.get(eachId));
                    }
                }
    
                return total;
            }
        }
    
        // Employee info
        class Employee {
            // It's the unique id of each node;
            // unique id of this employee
            public int id;
            // the importance value of this employee
            public int importance;
            // the id of direct subordinates
            public List<Integer> subordinates;
        };
    
    }
    
  • // OJ: https://leetcode.com/problems/employee-importance/
    // Time: O(N)
    // Space: O(N)
    class Solution {
    private:
        unordered_map<int, Employee*> m;
        int collect(int id) {
            auto e = m[id];
            int ans = e->importance;
            for (auto &s : e->subordinates) ans += collect(s);
            return ans;
        }
    public:
        int getImportance(vector<Employee*> employees, int id) {
            for (auto &e : employees) m[e->id] = e;
            return collect(id);
        }
    };
    
  • """
    # Employee info
    class Employee(object):
        def __init__(self, id, importance, subordinates):
            # It's the unique id of each node.
            # unique id of this employee
            self.id = id
            # the importance value of this employee
            self.importance = importance
            # the id of direct subordinates
            self.subordinates = subordinates
    """
    class Solution(object):
        def getImportance(self, employees, id):
            """
            :type employees: Employee
            :type id: int
            :rtype: int
            """
            employee_dict = {employee.id : employee for employee in employees}
            def dfs(id):
                return employee_dict[id].importance + sum(dfs(id) for id in employee_dict[id].subordinates)
            return dfs(id)
    

Java

  • /*
    // Employee info
    class Employee {
        // It's the unique id of each node;
        // unique id of this employee
        public int id;
        // the importance value of this employee
        public int importance;
        // the id of direct subordinates
        public List<Integer> subordinates;
    };
    */
    class Solution {
        public int getImportance(List<Employee> employees, int id) {
            Map<Integer, Integer> employeeImportanceMap = new HashMap<Integer, Integer>();
            Map<Integer, List<Integer>> employeeSubordinatesMap = new HashMap<Integer, List<Integer>>();
            for (Employee employee : employees) {
                int employeeId = employee.id;
                int importance = employee.importance;
                List<Integer> subordinates = employee.subordinates;
                employeeImportanceMap.put(employeeId, importance);
                if (subordinates != null)
                    employeeSubordinatesMap.put(employeeId, subordinates);
            }
            int totalImportance = 0;
            Queue<Integer> queue = new LinkedList<Integer>();
            queue.offer(id);
            while (!queue.isEmpty()) {
                int curId = queue.poll();
                int importance = employeeImportanceMap.get(curId);
                totalImportance += importance;
                List<Integer> subordinates = employeeSubordinatesMap.getOrDefault(curId, new ArrayList<Integer>());
                for (int subordinate : subordinates)
                    queue.offer(subordinate);
            }
            return totalImportance;
        }
    }
    
  • // OJ: https://leetcode.com/problems/employee-importance/
    // Time: O(N)
    // Space: O(N)
    class Solution {
    private:
        unordered_map<int, Employee*> m;
        int collect(int id) {
            auto e = m[id];
            int ans = e->importance;
            for (auto &s : e->subordinates) ans += collect(s);
            return ans;
        }
    public:
        int getImportance(vector<Employee*> employees, int id) {
            for (auto &e : employees) m[e->id] = e;
            return collect(id);
        }
    };
    
  • """
    # Employee info
    class Employee(object):
        def __init__(self, id, importance, subordinates):
            # It's the unique id of each node.
            # unique id of this employee
            self.id = id
            # the importance value of this employee
            self.importance = importance
            # the id of direct subordinates
            self.subordinates = subordinates
    """
    class Solution(object):
        def getImportance(self, employees, id):
            """
            :type employees: Employee
            :type id: int
            :rtype: int
            """
            employee_dict = {employee.id : employee for employee in employees}
            def dfs(id):
                return employee_dict[id].importance + sum(dfs(id) for id in employee_dict[id].subordinates)
            return dfs(id)
    

All Problems

All Solutions