Python 最小充分团队
假设一个项目需要一组技能列表 `req_skills`,以及一个人员列表 `people`。其中,第 i 个人 `people[i]` 包含该人拥有的技能列表。
现在假设一个充分的团队被定义为一组人员,对于 `req_skills` 中的每个所需技能,团队中至少有一人拥有该技能。我们可以用每个人的索引来表示这些团队:例如,假设团队是 `[0, 1, 3]`,这表示具有 `people[0]`、`people[1]` 和 `people[3]` 技能的人员。
我们必须找到规模最小的团队。
您可以按任何顺序返回答案。保证存在答案。
因此,如果输入类似于 `req_skills = ["java","flutter","android"]`,`people = [["java"],["android"],["flutter","android"]]`,则输出将为 `[0,2]`。
为了解决这个问题,我们将遵循以下步骤:
dp := 一个映射,添加与键 0 对应的空列表
key := 一个类似于 (value,i) 的映射,其中 value 来自 `req_skills`,i 是数字
对于来自 `people` 数组的人员对 (i, p) (通过获取人员并为其分配编号):
current_skill := 0
对于 p 中的每个技能:
current_skill := current_skill OR 2^key[skill]
对于 dp 键值对中的 (skill_set,members) 对:
total_skill := skill_set OR current_skill
如果 total_skill 与 skill_set 相同,则:
忽略以下部分,跳到下一个迭代
如果 total_skill 不在 dp 中或 dp[total_skill] 的大小 > members + 1 的大小,则
dp[total_skill] := members + [i]
返回 dp[(1 << len(req_skills))
让我们看看下面的实现,以便更好地理解:
示例
class Solution(object): def smallestSufficientTeam(self, req_skills, people): dp = {0:[]} key = {v:i for i,v in enumerate(req_skills)} for i,p in enumerate(people): current_skill = 0 for skill in p: current_skill |= 1<< key[skill] for skill_set, members in dp.items(): total_skill = skill_set|current_skill if total_skill == skill_set: continue if total_skill not in dp or len(dp[total_skill])> len(members)+1: dp[total_skill] = members + [i] return dp[(1<<len(req_skills)) - 1] ob = Solution() print(ob.smallestSufficientTeam(["java","flutter","android"], [["java"],["android"],["flutter","android"]]))
输入
["java","flutter","android"] [["java"],["android"],["flutter","android"]]
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
输出
[0,2]