@@ -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