forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution2.java
33 lines (33 loc) · 1.1 KB
/
Solution2.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public int[] recoverArray(int n, int[] sums) {
Arrays.sort(sums);
int[] sums1 = new int[1 << n];
int[] sums2 = new int[1 << n];
Map<Integer, Integer> cnt = new HashMap<>();
int[] ans = new int[n];
for (int i = n; i > 0; --i) {
int k = 1 << i;
int d = sums[k - 1] - sums[k - 2];
cnt.clear();
for (int j = 0; j < k; ++j) {
cnt.merge(sums[j], 1, Integer::sum);
}
int sign = 1;
for (int j = 0, p = 0; j < k; ++j) {
if (cnt.getOrDefault(sums[j], 0) == 0) {
continue;
}
cnt.merge(sums[j], -1, Integer::sum);
cnt.merge(sums[j] + d, -1, Integer::sum);
sums1[p] = sums[j];
sums2[p++] = sums[j] + d;
if (sums[j] + d == 0) {
sign = -1;
}
}
ans[i - 1] = sign * d;
System.arraycopy(sign == 1 ? sums1 : sums2, 0, sums, 0, k / 2);
}
return ans;
}
}