题目

给你两个整数数组 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的前c个数字,在nums2中找出c个数字,一一对应,从而使得异或和最小,因此我们可以使用n位的二进制数即可表示nums2的不同取值状态,第j位为1代表该情况下,nums2[j]已经被选择了.

  • 例如对于nums1 = [1,2], nums2 = [2,3]
  • 01表示nums2[1]=3已经被选择用于与nums1的前一个数字组成异或和了,dp[01]就是代表这种情况的最小异或和
  • 10表示nums2[0]=2已经被选择用于与nums1的前一个数字组成异或和了
    所以dp[11]应该从dp[01]或者dp[10]转移而来,并且需要加上新产生的异或值

状态转移

找出当前状态的上一步状态,进行转移

  1. 遍历nums2的每一个元素
  2. (1<<j)&i>0代表nums2[j]在当前状态下已经被选择,所以我们将这个选择取消(将这一位置零),就是上一步的其中一种状态dp[(1<<j)^i]
     for j := 0; j < n; j++ {if (1<<j)&i>0{val:=dp[(1<<j)^i]+(nums1[cnt(i)-1]^nums2[j])if val<dp[i]{dp[i]=val}}}

代码

func minimumXORSum(nums1 []int, nums2 []int) (res int){n:=len(nums1)cnt := func(cur int) (res int) {for k := 0; k < 31; k++ {res+=1&curcur>>=1}return}mask:=1<<ndp := make([]int, mask)for i := 1; i < mask; i++{dp[i]=2e9}for i := 1; i < mask; i++ {for j := 0; j < n; j++ {if (1<<j)&i>0{val:=dp[(1<<j)^i]+(nums1[cnt(i)-1]^nums2[j])if val<dp[i]{dp[i]=val}}}}return dp[mask-1]
}

leetcode 5756. 两个数组最小的异或值之和(状态压缩dp)相关推荐

  1. LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 回溯 2.2 状态压缩DP 1. 题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] ...

  2. LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...

  3. LeetCode -349 两个数组的交集

    难度:简单 给定两个数组 nums1 和 nums2 ,返回它们的交集 .输出结果中的每个元素一定是唯一 的.我们可以不考虑输出结果的顺序 . 题目链接 LeetCode -349 两个数组的交集 S ...

  4. 两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回

    /*************************************************************************** **description:两个有序数组A.B ...

  5. some数组遍历的用法/得到两组数组对象中某属性相同or不同的对象/对比两组数组中, 对象的某个值重复

    很早就知道some方法, 最近需求需要排查两组数组中有相同id的对象和不同id的对象, 实际运用到了some的妙用~ 首先举例我的需求如下(得到id相同和id不同的数据): const aa = [{ ...

  6. LeetCode 2044. 统计按位或能得到最大值的子集数目(状态压缩DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 . 如果数组 a 可 ...

  7. LeetCode 1799. N 次操作后的最大分数和(回溯 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 错误解 2.2 回溯超时解 2.3 回溯通过 2.4 状态压缩DP 1. 题目 给你 nums ,它是一个大小为 2 * n 的正整数数组. 你必须对这个数组 ...

  8. LeetCode 1066. 校园自行车分配 II(状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 回溯超时 2.2 状态压缩DP 1. 题目 在由 2D 网格表示的校园里有 n 位工人(worker)和 m 辆自行车(bike),n <= m.所有工 ...

  9. LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 2 * n 的整数数组. 你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 ...

最新文章

  1. 2.7 RMSprop-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  2. 寒假每日一题(提高组)【Week 2 完结】
  3. Vue+stylus实现自定义文字的loading组件
  4. postgres-#和postgres=#
  5. 复旦大学计算机应用能力,复旦大学计算机应用能力水平测试(FudanComputerSkills.doc...
  6. html5中figure怎么用,figure 和 figcaption 元素的正确使用方式
  7. linux wifi pro6818,GEC6818连接Ubuntu,下载程序至开发板
  8. 深度分析DROP,TRUNCATE与DELETE的区别【我的数据库之路系列】
  9. bp神经网络遗传算法举例,bp神经网络 遗传算法
  10. Frodo and pillows _CF760B
  11. Verbatim字符串
  12. 天龙八部雁门关外的故事
  13. 在html标签中写alert,文本不会写入页面,但会显示在alert()消息中。 JavaScript和HTML...
  14. 示波器中的Trigger
  15. 安卓app源码和设计报告——简易记账本
  16. oj趣味题:柱状图排序
  17. Matlab 迭代法计算灰值图像的level
  18. DedeCMS最新文章、相关文章、推荐文章、热点文章、头条
  19. 工作琐事太多怎么办_待办的事情太多,如何有条不紊的进行工作呢?
  20. 使用 Nginx 构建前端日志统计服务(打点采集)服务

热门文章

  1. 【Leetcode | 42】129. 求根到叶子节点数字之和
  2. 一文搞懂JVM架构和运行时数据区,全网最新
  3. 从新手到Flutter架构师,一篇就够!帮你突破瓶颈
  4. 耗时两个礼拜,8000字安卓面试长文,建议收藏
  5. java---Listener Filter知识点学习
  6. 怎么查这个文件在linux下的哪个目录
  7. 滚动一定的高度底色递增
  8. BZOJ 1176: [Balkan2007]Mokia
  9. 【mysql】Innodb三大特性之double write
  10. 团队开发框架(Developement Structure for Team),内容列表及整理计划