1
+ // Runtime: 10 ms (Top 99.69%) | Memory: 9.90 MB (Top 96.62%)
2
+
1
3
class Solution {
2
4
public:
3
- vector<int > smallestSufficientTeam (vector<string>& req_skills, vector<vector<string>>& people) {
4
- vector<int > mask (people.size (), 0 );
5
- for (int i=0 ; i<people.size (); i++){
6
- for (int j=0 ; j<req_skills.size (); j++){
7
- for (int z=0 ; z<people[i].size (); z++){
8
- if (people[i][z] == req_skills[j]){
9
- mask[i] += (1 <<j);
10
- break ;
11
- }
12
- }
5
+ std::vector<int > smallestSufficientTeam (std::vector<std::string>& req_skills, std::vector<std::vector<std::string>>& people) {
6
+ int n = req_skills.size ();
7
+ int m = people.size ();
8
+
9
+ std::unordered_map<std::string, int > skillToIndex;
10
+ for (int i = 0 ; i < n; i++) {
11
+ skillToIndex[req_skills[i]] = i;
12
+ }
13
+
14
+ std::vector<int > arr (m, 0 );
15
+ for (int i = 0 ; i < m; i++) {
16
+ std::vector<std::string>& personSkills = people[i];
17
+ int val = 0 ;
18
+ for (const std::string& skill : personSkills) {
19
+ val |= 1 << skillToIndex[skill];
13
20
}
21
+ arr[i] = val;
14
22
}
15
- vector<long long > dp (1 <<req_skills.size (), INT_MAX);
16
- vector<vector<int >> save (1 <<req_skills.size ());
17
- dp[0 ] = 0 ;
18
- for (int i=0 ; i<(1 <<req_skills.size ()); i++){
19
- for (int j=0 ; j<mask.size (); j++){
20
- int new_mask = i&(i^mask[j]);
21
- if (dp[new_mask]+1 <dp[i]){
22
- dp[i] = dp[new_mask]+1 ;
23
- save[i] = save[new_mask];
24
- save[i].push_back (j);
23
+
24
+ std::vector<bool > banned (m, false );
25
+ for (int i = 0 ; i < m; i++) {
26
+ for (int j = i + 1 ; j < m; j++) {
27
+ int val = arr[i] | arr[j];
28
+ if (val == arr[i]) {
29
+ banned[j] = true ;
25
30
}
31
+ else if (val == arr[j]) {
32
+ banned[i] = true ;
33
+ }
34
+ }
35
+ }
36
+
37
+ std::vector<int > ans;
38
+ helper (0 , n, arr, std::vector<int >(), banned, ans);
39
+
40
+ return ans;
41
+ }
42
+
43
+ private:
44
+ void helper (int cur, int n, const std::vector<int >& arr, std::vector<int > team, const std::vector<bool >& banned, std::vector<int >& ans) {
45
+ if (cur == (1 << n) - 1 ) {
46
+ if (ans.empty () || team.size () < ans.size ()) {
47
+ ans = team;
26
48
}
49
+ return ;
27
50
}
28
- return save[(1 <<req_skills.size ())-1 ];
29
51
52
+ if (!ans.empty () && team.size () >= ans.size ()) {
53
+ return ;
54
+ }
55
+
56
+ int zero = 0 ;
57
+ while (((cur >> zero) & 1 ) == 1 ) {
58
+ zero++;
59
+ }
60
+
61
+ for (int i = 0 ; i < arr.size (); i++) {
62
+ if (banned[i]) {
63
+ continue ;
64
+ }
65
+
66
+ if (((arr[i] >> zero) & 1 ) == 1 ) {
67
+ team.push_back (i);
68
+ helper (cur | arr[i], n, arr, team, banned, ans);
69
+ team.pop_back ();
70
+ }
71
+ }
30
72
}
31
- };
73
+ };
0 commit comments