1125.最小的必要团队
链接:1125.最小的必要团队
难度:Hard
标签:位运算、数组、动态规划、状态压缩
简介:请你返回 任一 规模最小的必要团队,团队成员用人员编号表示。
题解 1 - cpp
- 编辑时间:2023-04-08
- 执行用时:52ms
- 内存消耗:19.1MB
- 编程语言:cpp
- 解法介绍:遍历。
class Solution {
public:
    vector<int> smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>& people) {
        int n = req_skills.size(), m = people.size(), nmask = (1 << n) - 1;
        unordered_map<string, int> keym;
        for (int i = 0; i < n; i++) keym[req_skills[i]] = i;
        vector<vector<int>> dp(1 << n);
        for (int i = 0; i < m; i++) {
            int mask = 0;
            for (auto &key : people[i]) mask |= 1 << keym[key];
            for (int pmask = 0; pmask <= nmask; pmask++) {
                int merged = mask | pmask;
                if (merged == pmask || 
                    pmask && dp[pmask].empty() || 
                    dp[merged].size() && dp[merged].size() <= dp[pmask].size() + 1) continue;
                dp[merged] = dp[pmask];
                dp[merged].push_back(i);
            }
        }
        return dp[nmask];
    }
};
题解 2 - python
- 编辑时间:2023-04-08
- 执行用时:652ms
- 内存消耗:21.4MB
- 编程语言:python
- 解法介绍:同上。
 class Solution:
    def smallestSufficientTeam(self, req_skills: List[str], people: List[List[str]]) -> List[int]:
        n, m = len(req_skills), len(people)
        nmask = (1 << n) - 1
        keym = {}
        for i in range(n):
            keym[req_skills[i]] = i
        dp = [list() for _ in range(1 << n)]
        for i in range(m):
            mask = 0
            for key in people[i]:
                mask |= 1 << keym[key]
            for pmask in range(nmask + 1):
                merged = mask | pmask
                if merged == pmask or pmask and len(dp[pmask]) == 0 or len(dp[merged]) and len(dp[merged]) <= len(dp[pmask]) + 1:
                    continue
                dp[merged] = dp[pmask] + [i]
        return dp[nmask]
题解 3 - rust
- 编辑时间:2023-04-08
- 执行用时:12ms
- 内存消耗:5.7MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
    pub fn smallest_sufficient_team(req_skills: Vec<String>, people: Vec<Vec<String>>) -> Vec<i32> {
        use std::collections::HashMap;
        let (n, m) = (req_skills.len(), people.len());
        let nmask = (1 << n) - 1;
        let mut keym = HashMap::<String, usize>::new();
        let mut i = 0;
        for key in req_skills {
            keym.insert(key, i);
            i += 1;
        }
        let mut dp: Vec<Vec<i32>> = vec![vec![]; 1 << n];
        for i in 0..m {
            let mut mask = 0;
            for key in people[i].iter() {
                mask |= 1 << keym.get(key).unwrap();
            }
            for pmask in 0..=nmask {
                let merged = mask | pmask;
                if merged == pmask
                    || pmask > 0 && dp[pmask].is_empty()
                    || !dp[merged].is_empty() && dp[merged].len() <= dp[pmask].len() + 1
                {
                    continue;
                }
                dp[merged] = dp[pmask].clone();
                dp[merged].push(i as i32);
            }
        }
        dp[nmask].clone()
    }
}