首页 > 其他分享 >两个数组最小的异或值之和

两个数组最小的异或值之和

时间:2023-07-05 13:55:20浏览次数:41  
标签:int 最小 异或 数组 judge nums1 nums2

1. 状态压缩 + 动态规划

顺序不重要,依次枚举数组1的每个数,和数组2进行组合计算

class Solution {
public:
    int minimumXORSum(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        if(judge(nums1)||judge(nums2)){
            int res = 0;
            for(int i=0;i<n;i++)
                res = res + (nums1[i]^nums2[i]);
            return res;
        }
        vector<int> dp(1<<n,INT_MAX);//dp[i]表示i状态下的最小亦或和
        dp[0] = 0;//初始状态亦或和为0
        for(int i=0;i<n;i++){//依次遍历数组1中的数,加入到状态中
            for(int mask=0;mask<(1<<n);mask++){//遍历所有状态
                if(__builtin_popcount(mask)==i){//从小到大
                    for(int j=0;j<n;j++){ //尝试给数组2中每一个数进行亦或
                        int state = mask|(1<<j);
                        if(state==mask) continue;
                        dp[state] = min(dp[state],dp[mask]+ (nums1[i]^nums2[j]));
                    }
                }
            }
        }
        return dp[(1<<n)-1];
    }
    bool judge(vector<int>& nums){
        for(int i=1;i<nums.size();i++)
            if(nums[i]!=nums[i-1]) return false;//表示不全相同
        return true;
    }
};

标签:int,最小,异或,数组,judge,nums1,nums2
From: https://www.cnblogs.com/929code/p/17528326.html

相关文章

  • 24届秋招专场 · 数组如何用双指针解题呢?
    你好,我是安然无虞。文章目录删除有序数组中的重复项删除排序链表中的重复元素移除元素移除零大家好,近期主要更新数组相关的解题算法咯,感兴趣的老铁可以一起看过来啦。今天更新使用双指针解决数组部分题型,注意哦,这里所说的双指针不是C语言中“指针”的概念,指的是数组的索引下标,......
  • Leetcode155. 最小栈
    classMinStack{public:stack<int>st;multiset<int>s;MinStack(){}voidpush(intval){st.push(val);s.insert(val);}voidpop(){intval=st.top();st.pop();......
  • 第3章-栈、队列和数组
    3.1栈顺序栈的基本操作#defineMaxSize10typedefstruct{ //栈的顺序存储类型Elemtypedata[MaxSize]; //静态数组存放栈中元素 inttop; //栈顶指针}SqStack;//Sq:sequence--顺序//初始化栈voidInitStack(SqStack&S){S.top=-1; //初始化栈顶指针......
  • LeetCode 周赛 352(2023/07/02)一场关于子数组的专题周赛
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和[BaguTreePro]知识星球提问。往期回顾:LeetCode单周赛第350场·滑动窗口与离散化模板题单周赛352概览T1. 最长奇偶子数组(Easy)标签:滑动窗口、枚举T2. 和等于目标值的质数对(Medium)标签:质......
  • LeetCode 108. 将有序数组转换为二叉搜索树
    题目链接:LeetCode108.将有序数组转换为二叉搜索树题意:给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。解题思路:(递归)O(n)递归建立整......
  • Spring Boot 3.0.0 来啦!最小依赖 Java17!升还是不升?
    Spring官方于2022年1月20日发布SpringBoot3.0.0-M1版本,预示开启了SpringBoot3.0的里程碑。官方公告下的中文评论有点东西。。。熟悉的味道!就是那个味!  分享一篇朋友对SpringBoot3.0的介绍:生还是不生?SpringBoot3版本有起飞前兆,最小依赖Java17!一直......
  • Java数组和数据存储
    数组的定义数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的四个基本特点:1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.其元素的类型必须是相同类型,不允许出现混合类型。3.数组类型可以是任何数据类......
  • 数组元素积的符号
    已知函数 signFunc(x)将会根据x的正负返回特定值:如果x是正数,返回1。如果x是负数,返回-1。如果x是等于0,返回0。给你一个整数数组nums。令product为数组nums中所有元素值的乘积。返回signFunc(product)。示例1:输入:nums=[-1,-2,-3,-4,3,2,1]输......
  • JavaScript 数组的 reduce 方法有哪些应用
    JavaScript数组的reduce方法有哪些应用JavaScript中的reduce()方法可以用于将数组元素汇总为单个值,它接受一个回调函数作为参数,并在每个数组元素上调用该函数,以便将其累加到一个累加器变量中。下面是一些实际应用:数组求和:使用reduce()方法将数组元素相加,从而计算数组的总......
  • 指针遍历二维数组
    #include<stdio.h>intmain(){intarr[3][3]={{1,2,3},{4,5,6},{7,8,9}};int(*p)[3]=arr;inti=0;for(i=0;i<3;i++){intj=0;for(j=0;j<3;j++){printf("%d",*((*(p+i))+j));}printf("\......