计算特定条件下的四元组数量| 解题笔记

96 阅读1分钟

问题描述

小S正在处理一个数组,目标是找到满足特定条件的四元组数量。给定一个长度为n的数组a,他需要计算有多少四元组(i,j,k,l)(i,j,k,l)满足:
a_i + a_j = a_k ⊕ a_l,其中 ⊕⊕ 表示按位异或,并且满足索引的条件 i < j < k < l

由于答案可能非常大,所以你需要对 109+710^9+7 取模后输出结果。

测试样例

样例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);
    }
}