61
61
62
62
要使得所有 $2$ 人团队的技能点相等,最小值一定需要跟最大值匹配。因此,我们将数组 ` skill ` 排序,然后用双指针 $i$ 和 $j$ 分别指向数组的首位,两两匹配,判断其和是否均为同一个数。
63
63
64
- 若不是,说明技能点无法相等,直接返回 $-1$,否则,将化学反应累加到答案中
64
+ 若不是,说明技能点无法相等,直接返回 $-1$,否则,将化学反应累加到答案中。
65
65
66
66
遍历结束,返回答案即可。
67
67
68
68
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 是数组 ` skill ` 的长度。
69
69
70
+ ** 方法二:计数**
71
+
72
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 ` skill ` 的长度。
73
+
70
74
<!-- tabs:start -->
71
75
72
76
### ** Python3**
@@ -88,6 +92,26 @@ class Solution:
88
92
return ans
89
93
```
90
94
95
+ ``` python
96
+ class Solution :
97
+ def dividePlayers (self , skill : List[int ]) -> int :
98
+ s = sum (skill)
99
+ m = len (skill) >> 1
100
+ if s % m:
101
+ return - 1
102
+ t = s // m
103
+ d = defaultdict(int )
104
+ ans = 0
105
+ for v in skill:
106
+ if d[t - v]:
107
+ ans += v * (t - v)
108
+ m -= 1
109
+ d[t - v] -= 1
110
+ else :
111
+ d[v] += 1
112
+ return - 1 if m else ans
113
+ ```
114
+
91
115
### ** Java**
92
116
93
117
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -110,6 +134,31 @@ class Solution {
110
134
}
111
135
```
112
136
137
+ ``` java
138
+ class Solution {
139
+ public long dividePlayers (int [] skill ) {
140
+ int s = Arrays . stream(skill). sum();
141
+ int m = skill. length >> 1 ;
142
+ if (s % m != 0 ) {
143
+ return - 1 ;
144
+ }
145
+ int t = s / m;
146
+ int [] d = new int [1010 ];
147
+ long ans = 0 ;
148
+ for (int v : skill) {
149
+ if (d[t - v] > 0 ) {
150
+ ans += (long ) v * (t - v);
151
+ -- d[t - v];
152
+ -- m;
153
+ } else {
154
+ ++ d[v];
155
+ }
156
+ }
157
+ return m == 0 ? ans : - 1 ;
158
+ }
159
+ }
160
+ ```
161
+
113
162
### ** C++**
114
163
115
164
``` cpp
@@ -129,6 +178,30 @@ public:
129
178
};
130
179
```
131
180
181
+ ```cpp
182
+ class Solution {
183
+ public:
184
+ long long dividePlayers(vector<int>& skill) {
185
+ int s = accumulate(skill.begin(), skill.end(), 0);
186
+ int m = skill.size() / 2;
187
+ if (s % m) return -1;
188
+ int t = s / m;
189
+ int d[1010] = {0};
190
+ long long ans = 0;
191
+ for (int& v : skill) {
192
+ if (d[t - v]) {
193
+ ans += 1ll * v * (t - v);
194
+ --d[t - v];
195
+ --m;
196
+ } else {
197
+ ++d[v];
198
+ }
199
+ }
200
+ return m == 0 ? ans : -1;
201
+ }
202
+ };
203
+ ```
204
+
132
205
### ** Go**
133
206
134
207
``` go
@@ -146,16 +219,47 @@ func dividePlayers(skill []int) (ans int64) {
146
219
}
147
220
```
148
221
222
+ ``` go
223
+ func dividePlayers (skill []int ) int64 {
224
+ s := 0
225
+ for _ , v := range skill {
226
+ s += v
227
+ }
228
+ m := len (skill) >> 1
229
+ if s%m != 0 {
230
+ return -1
231
+ }
232
+ t := s / m
233
+ d := [1010 ]int {}
234
+ ans := 0
235
+ for _ , v := range skill {
236
+ if d[t-v] > 0 {
237
+ ans += v * (t - v)
238
+ d[t-v]--
239
+ m--
240
+ } else {
241
+ d[v]++
242
+ }
243
+ }
244
+ if m == 0 {
245
+ return int64 (ans)
246
+ }
247
+ return -1
248
+ }
249
+ ```
250
+
149
251
### ** JavaScript**
150
252
151
253
``` js
152
- var dividePlayers = function (skill ) {
153
- const n = skill .length , m = n / 2 ;
254
+ var dividePlayers = function (skill ) {
255
+ const n = skill .length ,
256
+ m = n / 2 ;
154
257
skill .sort ((a , b ) => a - b);
155
258
const sum = skill[0 ] + skill[n - 1 ];
156
259
let ans = 0 ;
157
260
for (let i = 0 ; i < m; i++ ) {
158
- const x = skill[i], y = skill[n - 1 - i];
261
+ const x = skill[i],
262
+ y = skill[n - 1 - i];
159
263
if (x + y != sum) return - 1 ;
160
264
ans += x * y;
161
265
}
0 commit comments