@@ -49,3 +49,106 @@ const smallestSufficientTeam = function(req_skills, people) {
49
49
}
50
50
return [ ]
51
51
}
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