import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
class Solution {
public int maxOperations(int[] nums) {
// Count occurrences of each number
Map
<Integer, Integer
> countMap
= new HashMap
<>(); for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
// Generate all unique pair sums
Set<Integer> uniqueSums = new HashSet<>();
int n = nums.length;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
uniqueSums.add(nums[i] + nums[j]);
}
}
int maxPairs = 0;
// Count pairs for each unique sum using the precomputed counts
for (int k : uniqueSums) {
maxPairs
= Math.
max(maxPairs, countPairsForK
(countMap, k
)); }
return maxPairs;
}
private int countPairsForK
(Map
<Integer, Integer
> countMap,
int k
) { int pairCount = 0;
for (Map.
Entry<Integer, Integer
> entry
: countMap.
entrySet()) { int num = entry.getKey();
int partner = k - num;
if (countMap.containsKey(partner)) {
if (num == partner) {
// If both numbers are the same, use combination formula nC2
pairCount += entry.getValue() / 2;
} else if (num < partner) { // To avoid double counting
// Count the pairs using the minimum of the counts of the two numbers
pairCount
+= Math.
min(entry.
getValue(), countMap.
get(partner
)); }
}
}
return pairCount;
}
public static void main
(String[] args
) { Solution solution = new Solution();
// Example input
int[] nums = {1, 2, 3, 4, 3, 2, 1};
int result = solution.maxOperations(nums);
System.
out.
println(result
); // Output the maximum number of pairs }
}
aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKCmNsYXNzIFNvbHV0aW9uIHsKICAgIHB1YmxpYyBpbnQgbWF4T3BlcmF0aW9ucyhpbnRbXSBudW1zKSB7CiAgICAgICAgLy8gQ291bnQgb2NjdXJyZW5jZXMgb2YgZWFjaCBudW1iZXIKICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gY291bnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgZm9yIChpbnQgbnVtIDogbnVtcykgewogICAgICAgICAgICBjb3VudE1hcC5wdXQobnVtLCBjb3VudE1hcC5nZXRPckRlZmF1bHQobnVtLCAwKSArIDEpOwogICAgICAgIH0KCiAgICAgICAgLy8gR2VuZXJhdGUgYWxsIHVuaXF1ZSBwYWlyIHN1bXMKICAgICAgICBTZXQ8SW50ZWdlcj4gdW5pcXVlU3VtcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICBpbnQgbiA9IG51bXMubGVuZ3RoOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IG47IGorKykgewogICAgICAgICAgICAgICAgdW5pcXVlU3Vtcy5hZGQobnVtc1tpXSArIG51bXNbal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpbnQgbWF4UGFpcnMgPSAwOwoKICAgICAgICAvLyBDb3VudCBwYWlycyBmb3IgZWFjaCB1bmlxdWUgc3VtIHVzaW5nIHRoZSBwcmVjb21wdXRlZCBjb3VudHMKICAgICAgICBmb3IgKGludCBrIDogdW5pcXVlU3VtcykgewogICAgICAgICAgICBtYXhQYWlycyA9IE1hdGgubWF4KG1heFBhaXJzLCBjb3VudFBhaXJzRm9ySyhjb3VudE1hcCwgaykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG1heFBhaXJzOwogICAgfQoKICAgIHByaXZhdGUgaW50IGNvdW50UGFpcnNGb3JLKE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBjb3VudE1hcCwgaW50IGspIHsKICAgICAgICBpbnQgcGFpckNvdW50ID0gMDsKCiAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgOiBjb3VudE1hcC5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgIGludCBudW0gPSBlbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgaW50IHBhcnRuZXIgPSBrIC0gbnVtOwoKICAgICAgICAgICAgaWYgKGNvdW50TWFwLmNvbnRhaW5zS2V5KHBhcnRuZXIpKSB7CiAgICAgICAgICAgICAgICBpZiAobnVtID09IHBhcnRuZXIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBib3RoIG51bWJlcnMgYXJlIHRoZSBzYW1lLCB1c2UgY29tYmluYXRpb24gZm9ybXVsYSBuQzIKICAgICAgICAgICAgICAgICAgICBwYWlyQ291bnQgKz0gZW50cnkuZ2V0VmFsdWUoKSAvIDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA8IHBhcnRuZXIpIHsgLy8gVG8gYXZvaWQgZG91YmxlIGNvdW50aW5nCiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgdGhlIHBhaXJzIHVzaW5nIHRoZSBtaW5pbXVtIG9mIHRoZSBjb3VudHMgb2YgdGhlIHR3byBudW1iZXJzCiAgICAgICAgICAgICAgICAgICAgcGFpckNvdW50ICs9IE1hdGgubWluKGVudHJ5LmdldFZhbHVlKCksIGNvdW50TWFwLmdldChwYXJ0bmVyKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBwYWlyQ291bnQ7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNvbHV0aW9uIHNvbHV0aW9uID0gbmV3IFNvbHV0aW9uKCk7CiAgICAgICAgLy8gRXhhbXBsZSBpbnB1dAogICAgICAgIGludFtdIG51bXMgPSB7MSwgMiwgMywgNCwgMywgMiwgMX07CiAgICAgICAgaW50IHJlc3VsdCA9IHNvbHV0aW9uLm1heE9wZXJhdGlvbnMobnVtcyk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7IC8vIE91dHB1dCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFpcnMKICAgIH0KfQo=