Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Smallest Sufficient Team

Updated
3 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "1125" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

In a project, you have a list of required skills req_skills, and a list of people. The ith person people[i] contains a list of skills that the person has. Consider a sufficient team: a set of people such that for every required skill in req_skills, there is at least one person in the team who has that skill. We can represent these teams by the index of each person. For example, team = [0, 1, 3] represents the people with skills people[0], people[1], and people[3]. Return any sufficient team of the smallest possible size, represented by the index of each person. You may return the answer in any order. It is guaranteed an answer exists. Example 1: Input: req_skills = ["java","nodejs","reactjs"], people = [["java"],["nodejs"],["nodejs","reactjs"]] Output: [0,2] Example 2: Input: req_skills = ["algorithms","math","java","reactjs","csharp","aws"], people = [["algorithms","math","java"],["algorithms","math","reactjs"],["java","csharp","aws"],["reactjs","csharp"],["csharp","math"],["aws","java"]] Output: [1,2] Constraints: 1 <= req_skills.length <= 16 1 <= req_skills[i].length <= 16 req_skills[i] consists of lowercase English letters. All the strings of req_skills are unique. 1 <= people.length <= 60 0 <= people[i].length <= 16 1 <= people[i][j].length <= 16 people[i][j] consists of lowercase English letters. All the strings of people[i] are unique. Every skill in people[i] is a skill in req_skills. It is guaranteed a sufficient team exists.

Explanation

  • Bitmasking for Skills: Represent each required skill with a bit in a bitmask. This allows us to efficiently track which skills are covered by a team using bitwise OR operations.
    • Dynamic Programming (Memoization): Use dynamic programming with memoization to explore all possible teams. The state of the DP is defined by the current bitmask representing covered skills.
    • Iterative Team Building: For each person, consider adding them to the current team and update the covered skills bitmask accordingly. Memoize the smallest team for each covered skills bitmask.
  • Runtime Complexity: O(2N * M), where N is the number of required skills and M is the number of people.
  • Storage Complexity: O(2N), to store the memoization table (smallest team for each skill bitmask).

Code

    def smallestSufficientTeam(req_skills: list[str], people: list[list[str]]) -> list[int]:
    """
    Finds the smallest sufficient team to cover all required skills.

    Args:
        req_skills: A list of required skills.
        people: A list of people, where each person has a list of skills.

    Returns:
        A list of the indices of the people in the smallest sufficient team.
    """

    skill_to_index = {skill: i for i, skill in enumerate(req_skills)}
    n = len(req_skills)
    m = len(people)

    skill_masks = [0] * m
    for i in range(m):
        for skill in people[i]:
            skill_masks[i] |= (1 << skill_to_index[skill])

    dp = {}  # {skill_mask: team}
    dp[0] = []  # Base case: no skills required, empty team

    for skill_mask in range(1 << n):
        if skill_mask in dp:
            for i in range(m):
                new_mask = skill_mask | skill_masks[i]
                new_team = dp[skill_mask] + [i]
                if new_mask not in dp or len(new_team) < len(dp[new_mask]):
                    dp[new_mask] = new_team

    return dp[(1 << n) - 1]

More from this blog

C

Chatmagic blog

2894 posts