LeetCode——5756. 两个数组最小的异或值之和[Minimum XOR Sum of Two Arrays][困难]——分析及代码[Java]
一、题目
给你两个整数数组 nums1 和 nums2 ,它们长度都为 n 。
两个数组的 异或值之和 为 (nums1[0] XOR nums2[0]) + (nums1[1] XOR nums2[1]) + … + (nums1[n - 1] XOR nums2[n - 1]) (下标从 0 开始)。
- 比方说,[1,2,3] 和 [3,2,1] 的 异或值之和 等于 (1 XOR 3) + (2 XOR 2) + (3 XOR 1) = 2 + 0 + 2 = 4 。
请你将 nums2 中的元素重新排列,使得 异或值之和 最小 。
请你返回重新排列之后的 异或值之和 。
示例 1:
输入:nums1 = [1,2], nums2 = [2,3]
输出:2
解释:将 nums2 重新排列得到 [3,2] 。
异或值之和为 (1 XOR 3) + (2 XOR 2) = 2 + 0 = 2 。
示例 2:
输入:nums1 = [1,0,3], nums2 = [5,3,4]
输出:8
解释:将 nums2 重新排列得到 [5,4,3] 。
异或值之和为 (1 XOR 5) + (0 XOR 4) + (3 XOR 3) = 4 + 4 + 0 = 8 。
提示:
- n == nums1.length
- n == nums2.length
- 1 <= n <= 14
- 0 <= nums1[i], nums2[i] <= 10^7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-xor-sum-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 状态压缩 + 动态规划
(1)思路
参考 n 的范围 [1, 14],可状态压缩后结合动态规划方法求解。
设计一个动态规划数组 dp[1 << n],对每个 dp[i],若 i 的二进制表示中 1 的个数为 num, 1 的位置为 k1, k2, …, knum, dp[i] 表示 nums1 的前 num 个数和 nums2 第