这是悦乐书的第291次更新,第309篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第159题(顺位题号是690)。定义员工信息的数据结构,其中包括员工的唯一ID,他的重要性值以及他的直接下属ID。例如,员工1是员工2的领导者,员工2是员工3的领导者。他们的重要性值分别为15,10和5。然后,员工1具有[1,15,[2]]等数据结构,员工2具有[2,10,[3]],员工3具有[3,5,[]]。请注意,虽然员工3也是员工1的下属,但该关系不是直接的。现在,根据公司的员工信息和员工ID,您需要返回该员工及其所有下属的总重要性值。

输入:[[1,5,[2,3]],[2,3,[]],[3,3,[]]],1

输出:11

说明:员工1具有重要性值5,他有两个直接下属:员工2和员工3.他们都具有重要性值3.因此员工1的总重要性值是5 + 3 + 3 = 11。

注意:

  • 一名员工最多只有一名直接领导,但是可以有多名下属。

  • 最多员工人数不超过2000人。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的意思是找到所给id员工的重要性以及所有下属员工重要性之和,如果其下属员工本身也有下属,也要算进去,也就是说该问题的子问题还是问题本身。因此我们可以使用递归的方法。

先找到当前id所在的员工信息和其下属员工的id集合,我们将其下属员工id放入HashSet中,然后再去遍历所有员工集合,如果HashSet中包含当前员工的id,就累加上其重要值,然后对其下属员工进行再处理,调用递归方法,最后返回sum。

/*
// 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) {
return helper(employees, id);
} public int helper(List<Employee> employees, int id){
List<Integer> sub = null;
int sum = 0;
for (Employee em : employees) {
if (em.id == id) {
sub = em.subordinates;
sum += em.importance;
break;
}
}
Set<Integer> set = new HashSet<Integer>();
for (Integer num : sub) {
set.add(num);
}
for (Employee em : employees) {
if (set.contains(em.id)) {
sum += helper(employees, em.id);
}
}
return sum;
}
}

03 第二种解法

我们可以对第一种解法再优化下,依旧使用递归,但是使用HashMap对初始员工数据进行处理,以id为key,以员工信息为value。递归方法中,以id为参数,查找当前id在HashMap中对应的员工信息,定义一个sum变量,初始值为当前员工的重要性,遍历当前员工的下属员工id集合,调用递归方法本身,最后返回sum。

/*
// 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 Map<Integer, Employee> map ;
public int getImportance(List<Employee> employees, int id) {
map = new HashMap<Integer, Employee>();
for (Employee em : employees) {
map.put(em.id, em);
}
return helper(id);
} public int helper(int id){
Employee em = map.get(id);
int sum = em.importance;
for (Integer num : em.subordinates) {
sum += helper(num);
}
return sum;
}
}

04 第三种解法

我们也可以使用迭代的方式来处理,借助队列来实现,当然你也可以使用栈。依旧是将所有的员工信息遍历放入HashMap中,以id为key,以员工信息为value。然后创建一个队列,将参数id作为初始元素入队列,接着对队列中的数据进行处理,出队列,然后使用id在HashMap中查找对应的value,找到后,累加上其重要值,然后遍历该员工的下属,将下属的id加入到队列中去,一直循环处理,直到队列为空。最后返回sum。

/*
// 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, Employee> map = new HashMap<Integer, Employee>();
for (Employee em : employees) {
map.put(em.id, em);
}
int sum = 0;
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(id);
while (!queue.isEmpty()) {
int temp = queue.poll();
Employee e = map.get(temp);
sum += e.importance;
for (Integer num : e.subordinates) {
queue.offer(num);
}
}
return sum;
}
}

05 小结

算法专题目前已日更超过四个月,算法题文章159+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Employee Importance(Java实现)的更多相关文章

  1. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  3. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  4. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  5. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  6. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  7. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  8. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  9. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

随机推荐

  1. 死磕 java集合之ArrayList源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可 ...

  2. 【netty】(1)---BIO NIO AIO演变

    BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...

  3. 【java爬虫】---爬虫+基于接口的网络爬虫

    爬虫+基于接口的网络爬虫 上一篇讲了[java爬虫]---爬虫+jsoup轻松爬博客,该方式有个很大的局限性,就是你通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的所有新闻.如果需要爬一个网站 ...

  4. 有了iron-node,调试Nodejs就是怎么so easy

    全局安装 iron-node工具 cnpm install -g iron-node 运行iron-node iron-node ./build/dev-server.js 调试效果图

  5. qcharts编译

    编译环境vs2013+qt5.5.1+perl5 qchart源码在git上自己下载,或者在此下载,参考文档:Qt Charts 5.7.0 安装教程,这篇文章是使用mingw的方式编译qcharts ...

  6. 微服务架构:Eureka参数配置项详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能 ...

  7. 简单的SQL注入之2

    Topic Link http://ctf5.shiyanbar.com/web/index_2.php 一.方法One sqlmap直接跑出来 1)暴库 2)爆表 3)爆段 4) 结果 二.方法Tw ...

  8. opensuse使用zypper安装软件

    安装软件(opensuse) opensuse 通过zypper可以方便的进行软件管理,类似centos的yum 软件. 命令参考 软件包操作 搜索软件 zypper search package 安 ...

  9. spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...

  10. 第37章 资源所有者密码验证(Resource Owner Password Validation) - Identity Server 4 中文文档(v1.0.0)

    如果要使用OAuth 2.0资源所有者密码凭据授权(aka password),则需要实现并注册IResourceOwnerPasswordValidator接口: public interface ...