LeetCode——690 员工的重要性(JAVA)

给定一个保存员工信息的数据结构,它包含了员工 唯一的 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 ,他有两个直系下属 23 ,而且 23 的重要度均为 3 。因此员工 1 的总重要度是 5 + 3 + 3 = 11

提示:

  • 一个员工最多有一个 直系 领导,但是可以有多个 直系 下属
  • 员工数量不超过 2000

思路

本题的结构是一个普通树,但是比较坑的一点是题目定义的Employee结点,它的孩子是以id形式存储的,如果是以List<Employee>存储的话,在DFS中搜索孩子结点会方便很多。因为是以id形式存储,并不能直接通过id得到员工本人,所以我这里先用一个HashMap遍历一遍输入的List<Employee> employees集合,来建立一个id->员工的映射,这样在DFS中搜索孩子结点时,只需要get(id)即可。

然后就是DFS搜索要注意的地方:
因为题目不一定是从根结点开始搜索,所以要先找到所输入id的那个员工,然后以它为根结点,遍历它的所有子树。至于重要度什么时候加,我认为在DFS结束之后加比较合适,否则如果在一个叶子结点就加一起,很容易会引起重复的相加。

另外,这里存储路径的path在每次DFS退出的时候,不需要删除最后一个结点,这样的话,整个DFS结束之后,path里存储的就是所有结点(包括根结点和它的所有子结点)。所以,在整个DFS结束之后,再遍历所有结点,将它们的重要度依次相加即可。

代码

public class Solution {
	class Employee {//实际提交时可以不写类定义
		//LeetCode自带
	    public int id;
	    public int importance;
	    public List<Integer> subordinates;
	};
	ArrayList<Employee> path = new ArrayList<Employee>();
	HashMap<Integer, Employee> info = new HashMap<Integer, Employee>();//建立id->员工的映射
	int sum = 0;
	public void dfs(HashMap<Integer, Employee> info, Employee e) {
		path.add(e);
		if(e.subordinates.size()==0) {//如果没孩子
			return;
		}
		else {
			for(int i=0;i<e.subordinates.size();i++) {
				Employee nextEmployee = new Employee();
				nextEmployee = info.get(e.subordinates.get(i));
				dfs(info, nextEmployee);
			}
		}
	}
	public int getImportance(List<Employee> employees, int id) {
		Employee query = new Employee();
		for(int i=0;i<employees.size();i++) {
			info.put(employees.get(i).id, employees.get(i));
			if(employees.get(i).id==id) query = employees.get(i);
		}
		dfs(info, query);
		for(int i=0;i<path.size();i++) {
			sum += path.get(i).importance;
		}
		return sum;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值