4
public int minimumXORSum(int[] nums1, int[] nums2) {7
cache = new Integer[n][1 << n];9
return getMinXorSum(0, 0, nums1, nums2);12
private int getMinXorSum(int index, int mask, int[] nums1, int[] nums2) {13
if (index == nums1.length) return 0;15
// retrieve from cache16
if (cache[index][mask] != null) return cache[index][mask];19
int minXorSum = Integer.MAX_VALUE;21
for (int i = 0; i < nums2.length; i++) {22
if ((mask >> i & 1) == 1) continue;25
(nums1[index] ^ nums2[i]) + getMinXorSum(index + 1, mask | (1 << i), nums1, nums2);27
// update minimum xor sum28
minXorSum = Math.min(xorSum, minXorSum);32
cache[index][mask] = minXorSum;