1787.使所有区间的异或结果为零

2023-11-10

题意:

给你一个整数数组 nums​​​ 和一个整数 k​​​​​ 。区间 [left, right](left <= right)的 异或结果 是对下标位于 left 和 right(包括 left 和 right )之间所有元素进行 XOR 运算的结果:nums[left] XOR nums[left+1] XOR … XOR nums[right] 。

返回数组中 要更改的最小元素数 ,以使所有长度为 k 的区间异或结果等于零。

示例 1:
输入:nums = [1,2,0,3,0], k = 1
输出:3
解释:将数组 [1,2,0,3,0] 修改为 [0,0,0,0,0]

示例 2:
输入:nums = [3,4,5,2,1,7,3,4,7], k = 3
输出:3
解释:将数组 [3,4,5,2,1,7,3,4,7] 修改为 [3,4,7,3,4,7,3,4,7]

示例 3:
输入:nums = [1,2,4,1,2,5,1,2,6], k = 3
输出:3
解释:将数组[1,2,4,1,2,5,1,2,6] 修改为 [1,2,3,1,2,3,1,2,3]

提示:
1 <= k <= nums.length <= 2000
​​​​​​0 <= nums[i] < 210

思路:

动态规划
设数组nums的长度为n,首先我们需要分析出数组nums在修改之后应当具有哪些性质。
由于任意长度为k的区间异或结果等于0,那么对于任意的i,有:
nums[i]⊕nums[i+1]⊕⋯⊕nums[i+k−1]=0 (1)
以及:
nums[i+1]⊕nums[i+2]⊕⋯⊕nums[i+k]=0 (2)
其中⊕表示异或运算。根据异或运算的性质 a⊕b⊕b=a,将(1)(2)两式联立,即可得到:
nums[i]⊕nums[i+k]=0
其等价于nums[i]=nums[i+k]。因此我们可以得出一个重要的结论:
数组 nums 在修改之后是一个以 k 为周期的周期性数组,即 ∀i∈[0,n−k),nums[i]=nums[i+k]。
因此,我们可以将数组nums按照下标对k取模的结果0,1,⋯,k−1 分成 k 个组,每个组内的元素必须要相等,并且这 k 个组对应的元素的异或和为 0,即:
nums[0]⊕nums[1]⊕⋯⊕nums[k−1]=0
只要满足上述的要求,修改后的数组的所有长度为 k 的区间异或结果一定等于 0。
对于第i个组,我们可以使用哈希映射来存储该组内的元素以及每个元素出现的次数,这样一来,我们就可以尝试使用动态规划来解决本题了。
设 f(i,mask) 表示我们已经处理了第0,1,⋯,i 个组,并且这些组对应元素的异或和:

nums[0]⊕nums[1]⊕⋯⊕nums[i]

为 mask 的前提下,这些组总计最少需要修改的元素个数。在进行状态转移时,我们可以枚举第 i 组被修改成了哪个数。假设其被修改成了 x,那么第 0,1,⋯,i−1 个组对应的元素的异或和即为 mask⊕x,因此我们可以得到状态转移方程:
f(i,mask)= min{f(i−1,mask⊕x)+size(i)−count(i,x)}
其中 size(i) 表示第 i 个组里的元素个数,count(i,x) 表示第 i 个组里元素 x 的次数,它们的值都可以通过哈希映射得到。上述状态转移方程的意义即为:如果我们选择将第 i 组全部修改为 x,那么有 count(i,x) 个数是无需修改的,这样就需要修改 size(i)−count(i,x) 次。

优化
对于未优化的状态转移方程:
f(i,mask)= min{f(i−1,mask⊕x)+size(i)−count(i,x)}
首先 size(i) 是与 x 无关的常量,我们可以将其移出最小值的限制,即:
f(i,mask)=size(i)+ min{f(i−1,mask⊕x)−count(i,x)}
由于我们需要求的是「最小值」,因此在状态转移方程中添加若干大于等于「最小值」的项,对最终的答案不会产生影响。
考虑 count(i,x) 这一项,如果 xx 没有在哈希表中出现,那么这一项的值为 0,否则这一项的值大于 0。即:
如果 x 没有在哈希表中出现,那么转移的状态为:
f(i−1,mask⊕x)
如果 x 在哈希表中出现,那么转移的状态为:
f(i−1,mask⊕x)−count(i,x)
它严格小于 f(i−1,mask⊕x)。如果我们在状态转移方程中添加 f(i−1,mask⊕x),最终的答案不会变化。
因此我们可以将状态转移方程变化为:
f(i,mask)=size(i)+min{t1,t2}
其中 t1对应 x 在哈希表中出现的状态,即:
t1=min{f(i−1,mask⊕x)−count(i,x)}
t2对应 x 不在哈希表中出现的状态,以及 x 在哈希表中出现并且我们额外添加的状态,即:
t2=minf(i−1,mask⊕x)

class Solution {
private:
    // x 的范围为 [0, 2^10)
    static constexpr int MAXX = 1 << 10;
    // 极大值,为了防止整数溢出选择 INT_MAX / 2
    static constexpr int INFTY = INT_MAX / 2;
    
public:
    int minChanges(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> f(MAXX, INFTY);
        // 边界条件 f(-1,0)=0
        f[0] = 0;
        
        for (int i = 0; i < k; ++i) {
            // 第 i 个组的哈希映射
            unordered_map<int, int> cnt;
            int size = 0;
            for (int j = i; j < n; j += k) {
                ++cnt[nums[j]];
                ++size;
            }

            // 求出 t2
            int t2min = *min_element(f.begin(), f.end());

            vector<int> g(MAXX, t2min);
            for (int mask = 0; mask < MAXX; ++mask) {
                // t1 则需要枚举 x 才能求出
                for (auto [x, countx]: cnt) {
                    g[mask] = min(g[mask], f[mask ^ x] - countx);
                }
            }
            
            // 别忘了加上 size
            for_each(g.begin(), g.end(), [&](int& val) {val += size;});
            f = move(g);
        }

        return f[0];
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1787.使所有区间的异或结果为零 的相关文章

随机推荐

  • 11月7日 Unreal Engine Rider 学习笔记

    创建蓝图接口 添加蓝图Class 添加接口用指针 添加宝箱Actor类 添加Mesh类 首先在类后面添加一个公用接口声明 class ACTIONROUGELIKE API AASItemChest public AActor public
  • 华为OD机试 - 食堂供餐(Java)

    题目描述 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在需要根据以往员工取餐的统计信息 计算出一个刚好能达成排队时间为0的最低供餐速度 即 食堂在每个单位时间内必须至少做出多少价盒饭才能满足要求
  • httpclient下载文件

    private static CloseableHttpClient client static PoolingHttpClientConnectionManager connectionManager new PoolingHttpCli
  • 抓httpclient发送的http请求包

    1 使用fiddler或者Charles抓不到httpclient发送的http请求包 2 需要使用以下代码 HttpHost proxy new HttpHost 127 0 0 1 8888 http 127 0 0 1 8888地址为
  • 大数据:HDFS的Shell常用命令操作

    文章目录 一 HDFS的Shell介绍 二 HDFS常用命令操作 01 创建目录 1 创建单层目录 3 创建多层目录 02 查看目录 03 上传本地文件到HDFS 04 查看文件内容 05 下载HDFS文件到本地 06 删除HDFS文件 0
  • char、varchar、nchar、nvarchar的区别

    对于程序中的string型字段 SQLServer中有char varchar nchar nvarchar四种类型来对应 暂时不考虑text和ntext 开建立数据库中 对这四种类型往往比较模糊 这里做一下对比 定长或变长 所谓定长就是长
  • 阿里巴巴面试总结:测试工程师

    阿里巴巴的面试是网上预约的时间 武汉一共有两天 五号和六号 原先是担心自己准备的不够充分 就把时间往后面移 最后定的是六号的下午四点半到六点的场 基本也就是武汉的最后一场 后来才发现 武汉可以说的上是全国比较晚面试的了 而今年马云又放出了风
  • 自然语言处理面试34题:NLP面试考点,精准详尽解析

    篇幅有限 本文不会把每一题的参考答案都加载出来 会摘出一些摘要 完整解析见题库 添加老师微信 julyedukefu14 回复 6 领取最新升级版 名企AI面试100题 电子书 1 了解Google最新的模型bert么 Google AI
  • 天空图立方体贴图转化为辐照度立方体贴图

    创建立方体贴图 注意 立方体贴图的大小决定被转化的辐照度贴图的精度 irradianceCubeMap new CubeMap 32 调用 CubeMap CubeMap int CubeSize CubeSize CubeSize ini
  • 一文带你读懂聚类

    1 聚类思想 作为无监督学习的一个重要方法 聚类是将样本集D划分为若干互不相交的子集 即样本簇 聚类的思想就是把属性相似的样本归到一类 对于每一个数据点 我们可以把它归到一个特定的类 同时每个类之间的所有数据点在某种程度上有着共性 比如空间
  • 写给程序员的机器学习入门 (四) - 训练过程中常用的技巧

    人工智能学习离不开实践的验证 推荐大家可以多在FlyAI AI竞赛服务平台多参加训练和竞赛 以此来提升自己的能力 FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台 每周免费提供项目开源算法样例 支持算法能力变现以及快
  • python手机端下载-Python3,x:如何进行手机APP的数据爬取

    Python3 x 如何进行手机APP的数据爬取 一 简介 平时我们的爬虫多是针对网页的 但是随着手机端APP应用数量的增多 相应的爬取需求也就越来越多 因此手机端APP的数据爬取对于一名爬虫工程师来说是一项必备的技能 我们知道 网页爬取的
  • SQLI-LABS Less-17

    Update 数据库更新注入 具体情况 具体分析 函数 check input 对 uname 进行检查 从 uname 处是无法注入了 而对 passwd 进行了更新 可以利用这个 updata 进行注入 注意 这里必须的 uname 必
  • 因为计算机中丢失VCRUNTIME140怎么办?为什么会丢失VCRUNTIME140.dll

    vcruntime140 dll是一个Windows动态链接库 其主要功能是为C C 编译的程序提供运行时支持 这个库在Microsoft Visual Studio 2015中被引入 其名称中的 140 代表版本号 在我们打开运行软件或者
  • MySQL的索引类型和实现原理

    一 按表列属性分类 1 单列索引 以表的单个列字段创建的索引 2 联合索引 以表的多个列字段组合创建的索引 在查询条件使用索引的从左字段顺序才会生效 遵循最左匹配原则 单列索引和联合索引又包括 普通索引 非主键 非唯一列的索引 主键索引 基
  • 计蒜客T1115——字符串判等

    水题不解释 考研复习压力偶尔写一道换换心情还不错 这里有一个比较有趣的知识点 对于同时输入多个字符串时还要允许空格的输入 那么普通的cin函数就不能满足要求了 这里采用getline函数解决 如下 string s1 s2 getline
  • Docker基本命令使用——(1)

    Docker常用命令 docker images 列出本地主机上的镜像 a 列出本地所有的镜像 含中间映像层 q 只显示镜像ID digests 显示镜像的摘要信息 no trunc 显示完整的镜像信息 docker search xxx
  • 3000帧动画图解MySQL为什么需要binlog、redo log和undo log

    全文建立在MySQL的存储引擎为InnoDB的基础上 先看一条SQL如何入库的 这是一条很简单的更新SQL 从MySQL服务端接收到SQL到落盘 先后经过了MySQL Server层和InnoDB存储引擎 Server层就像一个产品经理 分
  • produces在@requestMapping中的使用方式和作用

    转载自 https blog csdn net jaryle article details 72965885 produces可能不算一个注解 因为什么呢 它是注解 requestMapping注解里面的属性项 它的作用是指定返回值类型
  • 1787.使所有区间的异或结果为零

    题意 给你一个整数数组 nums 和一个整数 k 区间 left right left lt right 的 异或结果 是对下标位于 left 和 right 包括 left 和 right 之间所有元素进行 XOR 运算的结果 nums