Skip to content

Commit c833d13

Browse files
authored
Update 1125-smallest-sufficient-team.js
1 parent 1301f29 commit c833d13

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

1125-smallest-sufficient-team.js

+103
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,106 @@ const smallestSufficientTeam = function(req_skills, people) {
4949
}
5050
return []
5151
}
52+
53+
// another
54+
55+
/**
56+
* @param {string[]} req_skills
57+
* @param {string[][]} people
58+
* @return {number[]}
59+
*/
60+
const smallestSufficientTeam = function(req_skills, people) {
61+
let skill_len = req_skills.length
62+
63+
// 将people转换为id的模式
64+
let id_people = []
65+
let hash = {}
66+
for (let i = 0; i < skill_len; i++) {
67+
hash[req_skills[i]] = i
68+
}
69+
for (let i = 0; i < people.length; i++) {
70+
id_people[i] = []
71+
for (let j = 0; j < people[i].length; j++) {
72+
id_people[i][j] = hash[people[i][j]]
73+
}
74+
}
75+
76+
// 过滤掉不可能的选取的人员
77+
let skip = {}
78+
for (let i = 0; i < id_people.length; i++) {
79+
if (skip[i]) continue
80+
let skills = Array(skill_len).fill(0)
81+
for (let j = 0; j < id_people[i].length; j++) {
82+
let curId = id_people[i][j]
83+
skills[curId]++
84+
}
85+
for (let k = i + 1; k < id_people.length; k++) {
86+
if (skip[k]) continue
87+
let needSkip = true
88+
for (let l = 0; l < id_people[k].length; l++) {
89+
let id = id_people[k][l]
90+
if (skills[id] === 0) {
91+
needSkip = false
92+
break
93+
}
94+
}
95+
if (needSkip) {
96+
skip[k] = true
97+
}
98+
}
99+
}
100+
101+
// 构造精简后的人员,并且保存对应的index关系
102+
let slim_people = []
103+
let idHash = {}
104+
for (let i = 0; i < id_people.length; i++) {
105+
if (skip[i]) continue
106+
idHash[slim_people.length] = i
107+
slim_people.push(id_people[i])
108+
}
109+
110+
// 执行回溯
111+
let res = Infinity
112+
let remain = {}
113+
let ans = null
114+
for (let i = 0; i < slim_people.length; i++) {
115+
remain[i] = false
116+
}
117+
let init_select = Array(skill_len).fill(0)
118+
119+
backtrack(0, init_select, 0, remain)
120+
121+
return ans
122+
123+
function backtrack(id, select, count, remain) {
124+
if (count >= res) return
125+
let done = true
126+
for (let i = 0; i < select.length; i++) {
127+
if (select[i] === 0) {
128+
done = false
129+
}
130+
}
131+
if (done) {
132+
res = count
133+
let _res_ = []
134+
for (let k in remain) {
135+
if (remain[k]) _res_.push(idHash[k])
136+
}
137+
ans = _res_
138+
return
139+
}
140+
for (let k = id; k < slim_people.length; k++) {
141+
let arr = slim_people[k]
142+
for (let i = 0; i < arr.length; i++) {
143+
select[arr[i]]++
144+
}
145+
remain[k] = true
146+
backtrack(k + 1, select, count + 1, remain)
147+
remain[k] = false
148+
for (let i = 0; i < arr.length; i++) {
149+
select[arr[i]]--
150+
}
151+
}
152+
}
153+
}
154+

0 commit comments

Comments
 (0)