LeetCode 0690.员工的重要性:哈希表+广度优先搜索

2024-08-27 09:04

本文主要是介绍LeetCode 0690.员工的重要性:哈希表+广度优先搜索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【LetMeFly】690.员工的重要性:哈希表+广度优先搜索

力扣题目链接:https://leetcode.cn/problems/employee-importance/

你有一个保存员工信息的数据结构,它包含了员工唯一的 id ,重要度和直系下属的 id 。

给定一个员工数组 employees,其中:

  • employees[i].id 是第 i 个员工的 ID。
  • employees[i].importance 是第 i 个员工的重要度。
  • employees[i].subordinates 是第 i 名员工的直接下属的 ID 列表。

给定一个整数 id 表示一个员工的 ID,返回这个员工和他所有下属的重要度的 总和

 

示例 1:

输入:employees = [[1,5,[2,3]],[2,3,[]],[3,3,[]]], id = 1
输出:11
解释:
员工 1 自身的重要度是 5 ,他有两个直系下属 2 和 3 ,而且 2 和 3 的重要度均为 3 。因此员工 1 的总重要度是 5 + 3 + 3 = 11 。

 

示例 2:

输入:employees = [[1,2,[5]],[5,-3,[]]], id = 5
输出:-3
解释:员工 5 的重要度为 -3 并且没有直接下属。
因此,员工 5 的总重要度为 -3。

 

提示:

  • 1 <= employees.length <= 2000
  • 1 <= employees[i].id <= 2000
  • 所有的 employees[i].id 互不相同
  • -100 <= employees[i].importance <= 100
  • 一名员工最多有一名直接领导,并可能有多名下属。
  • employees[i].subordinates 中的 ID 都有效。

解题方法:哈希表+广度优先搜索

因为要多次依据员工id获取员工信息,因此可以二话不说建立一个哈希表。

接着只需要一个广度优先搜索,从id这个员工开始,出队时累加重要程度并将所有子员工入队,直至队列为空。

  • 时间复杂度 O ( l e n ( e m p l o y e e s ) ) O(len(employees)) O(len(employees))
  • 空间复杂度 O ( l e n ( e m p l o y e e s ) ) O(len(employees)) O(len(employees))

AC代码

Python
from typing import List# # Definition for Employee.
# class Employee:
#     def __init__(self, id: int, importance: int, subordinates: List[int]):
#         self.id = id
#         self.importance = importance
#         self.subordinates = subordinatesclass Solution:def getImportance(self, employees: List['Employee'], id: int) -> int:table = dict()for e in employees:table[e.id] = eans = 0q:List['Employee'] = [table[id]]while q:this = q.pop()ans += this.importancefor next in this.subordinates:q.append(table[next])return ans
C++
// // Definition for Employee.
// class Employee {
// public:
//     int id;
//     int importance;
//     vector<int> subordinates;
// };class Solution {
public:int getImportance(vector<Employee*> employees, int id) {unordered_map<int, Employee*> table;for (Employee* thisEmployee : employees) {table[thisEmployee->id] = thisEmployee;}int ans = 0;queue<Employee*> q;q.push(table[id]);while (q.size()) {Employee* thisEmployee = q.front();q.pop();ans += thisEmployee->importance;for (int nextEmployeeId : thisEmployee->subordinates) {q.push(table[nextEmployeeId]);}}return ans;}
};
Java
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.Queue;
import java.util.LinkedList;// // Definition for Employee.
// class Employee {
//     public int id;
//     public int importance;
//     public List<Integer> subordinates;
// };class Solution {public int getImportance(List<Employee> employees, int id) {Map<Integer, Employee> table = new HashMap<Integer, Employee>();for (Employee thisEmployee : employees) {table.put(thisEmployee.id, thisEmployee);}int ans = 0;Queue<Employee> q = new LinkedList<Employee>();q.add(table.get(id));while (!q.isEmpty()) {Employee thisEmployee = q.poll();ans += thisEmployee.importance;for (int nextId : thisEmployee.subordinates) {q.add(table.get(nextId));}}return ans;}
}
Golang
package mainimport "container/list"  // 其实是一个列表// // Definition for Employee.
// type Employee struct {
//     Id int
//     Importance int
//     Subordinates []int
// }func getImportance(employees []*Employee, id int) int {table := map[int]*Employee{};for _, thisEmployee := range employees {table[thisEmployee.Id] = thisEmployee;}ans := 0q := list.New()q.PushBack(table[id])for q.Len() > 0 {thisEmployee := q.Front()q.Remove(thisEmployee)ans += thisEmployee.Value.(*Employee).Importancefor _, nextId := range thisEmployee.Value.(*Employee).Subordinates {q.PushBack(table[nextId])}}return ans
}

End

不得不说,这题员工的重要程度还有负数,也忒损了。

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/141576521

这篇关于LeetCode 0690.员工的重要性:哈希表+广度优先搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111222

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;