Pyhton 中最小的充分团队

pythonserver side programmingprogramming更新于 2026/1/22 9:48:17

假设对于一个项目,我们有一个名为 req_skills 的所需技能列表和人员列表。这里第 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 是数字

  • 对于 number,person 对 (i, p),从 people 数组中获取 people 并为其分配数字 −

    • current_skill := 0

    • for skill in p

      • current_skill := current_skill OR 2^key[skill]

    • for (skill_set,members) 对在 dp 键值对中 −

      • total_skill := skill_set OR current_skill

      • 如果 total_skill 与 skill_set 相同,则 −

        • 忽略以下部分,跳到下一次迭代

      • 如果 total_skill 不在 do 中或 dp[total_skill] 的大小 >成员大小 + 1,然后

        • dp[total_skill] := members + [i]

  • return 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"]]

输出

[0,2]

相关文章


有用资源