- Notifications
You must be signed in to change notification settings - Fork 121
Expand file tree
/
Copy path3SumWithMultiplicity.java
More file actions
Latest commit
47 lines (46 loc) · 1.75 KB
/
Copy path3SumWithMultiplicity.java
File metadata and controls
47 lines (46 loc) · 1.75 KB
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* Given an integer array A, and an integer target, return the number of tuples i, j, k such that i < j < k and A[i] + A[j] + A[k] == target.
*
* As the answer can be very large, return it modulo 10^9 + 7.
*/
classSolution {
publicintthreeSumMulti(int[] A, inttarget) {
Map<Integer, Integer> count = newHashMap<>();
for (inta : A) {
if (count.containsKey(a)) {
count.put(a, count.get(a) + 1);
} else {
count.put(a, 1);
}
}
Object[] elements = count.keySet().toArray();
Integer[] integers = Arrays.copyOf(elements, elements.length, Integer[].class);
longret = 0;
Arrays.sort(integers);
for (inti = 0; i < integers.length; i++) {
for (intj = i; j < integers.length; j++) {
intrest = target - integers[i] - integers[j];
if (count.containsKey(rest) && rest >= integers[j]) {
if (integers[i] == integers[j] && integers[j] == rest) {
ret += calculate(count.get(rest), 3);
} elseif (integers[i] == rest && integers[i] != integers[j]) {
ret += (calculate(count.get(integers[i]), 2) * count.get(integers[j]));
} elseif (integers[j] == rest && integers[i] != integers[j]) {
ret += (calculate(count.get(integers[j]), 2) * count.get(integers[i]));
} elseif (integers[i] == integers[j] && integers[i] != rest) {
ret += (calculate(count.get(integers[j]), 2) * count.get(rest));
} else {
ret += (count.get(integers[i]) * count.get(integers[j]) * count.get(rest));
}
}
}
}
return (int) (ret % (1e9 + 7));
}
privatelongcalculate(longx, longn) {
if (n == 2) {
returnx * (x - 1) / 2;
}
returnx * (x - 1) * (x - 2) / 6;
}
}