Skip to content

Commit 0129d3b

Browse files
committed
Runtime: 10 ms (Top 99.69%) | Memory: 9.90 MB (Top 96.62%)
1 parent d8d9501 commit 0129d3b

File tree

1 file changed

+64
-22
lines changed

1 file changed

+64
-22
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,73 @@
1+
// Runtime: 10 ms (Top 99.69%) | Memory: 9.90 MB (Top 96.62%)
2+
13
class Solution {
24
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];
1320
}
21+
arr[i] = val;
1422
}
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;
2530
}
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;
2648
}
49+
return;
2750
}
28-
return save[(1<<req_skills.size())-1];
2951

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+
}
3072
}
31-
};
73+
};

0 commit comments

Comments
 (0)