问题描述
小S正在处理一个数组,目标是找到满足特定条件的四元组数量。给定一个长度为n的数组a,他需要计算有多少四元组(i,j,k,l)(i,j,k,l)满足:
a_i + a_j = a_k ⊕ a_l,其中 ⊕⊕ 表示按位异或,并且满足索引的条件 i < j < k < l。
由于答案可能非常大,所以你需要对 取模后输出结果。
测试样例
样例1:
输入:
n = 5, a = [2, 3, 1, 5, 4]
输出:1
样例2:
输入:
n = 6, a = [1, 2, 3, 4, 5, 6]
输出:1
样例3:
输入:
n = 4, a = [4, 1, 3, 2]
输出:0
解题思路
已知i<j<k<l,所以循环中k>2,l>3,可以得到不同取值下的目标target=a[k]⊕a[l],现在目的是找到i<j<k的a[i]+a[j]=target,而考虑到在循环中k不断递增,对于可选的i,j实际上相当于在上一循环的基础上,加上上一个k与前k-1个值相加,考虑用HashMap存储前K-1个数两两相加的结果和相应的个数。
代码实现
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int solution(int n, int[] a) {
// write code here
int mod = 1000000007;
int sum = 0;
Map<Integer, Integer> list = new HashMap<>();
for (int i = 2; i < n; i++) {
for (int j = 0; j < i - 1; j++) {
list.put(a[j] + a[i - 1], list.getOrDefault(a[j] + a[i - 1], 0) + 1);
}
for (int j = i + 1; j < n; j++) {
int target = a[i] ^ a[j];
sum += list.getOrDefault(target, 0);
sum%=mod;
}
}
return sum;
}
public static void main(String[] args) {
System.out.println(solution(5, new int[] { 2, 3, 1, 5, 4 }) == 1);
System.out.println(solution(6, new int[] { 1, 2, 3, 4, 5, 6 }) == 1);
System.out.println(solution(4, new int[] { 4, 1, 3, 2 }) == 0);
}
}