当前位置: 首页 > news >正文

如何求「加减 value 任意次后的最大 MEX」同余类求解

算法解析:如何求「加减 value 任意次后的最大 MEX」

前言

最近在刷题时遇到一道有趣的题目:

给你一个整数数组 nums 和一个整数 value,你可以对数组中的任意元素做任意次加上或减去 value 的操作。
问:执行任意操作后,数组的 最大 MEX(最小缺失非负整数)是多少?

乍一看,这题和普通 MEX 题不一样,它引入了“±value 操作”,需要一点数学和余数类的知识才能高效解决。


一、理解题目

关键点:

  1. 每个数可以 ±value 任意次。
  2. MEX(Minimum EXcluded)是数组中缺失的最小非负整数。
  3. 我们想找到 在操作任意次后,数组能覆盖的最大连续非负整数序列

二、核心思想:同余类

1. 同余类定义

给定正整数 m,两个整数 ab 如果满足:

a ≡ b (mod m)

也就是 (a - b) 可以被 m 整除,那么 ab 属于同一 同余类

同余类 [a]_m 定义为:

[a]_m = { a + k*m | k ∈ Z }

也就是说,同余类里的每个数模 m 后余数相同。


2. 为什么本题与同余类相关?

题目允许 ±value 操作:

num → num + k*value

那么每个数 只能生成它所在同余类中的数

  • 余数 = (num % value + value) % value
  • 类内数值可正可负,形如 num + k*value

例如:

num = 2, value = 3
可生成数 = ..., -4, -1, 2, 5, 8, ...
所有数模 3 = 2

三、算法步骤

1. 统计每个同余类数量

int[] count = new int[value];
for (int num : nums) {int r = ((num % value) + value) % value;count[r]++;
}
  • count[r] 表示余数类 r 中的元素数量
  • 数组长度 = value,因为余数类编号 [0, value-1]

2. 贪心计算最大 MEX

mex = 0 开始:

  1. 计算 mod = mex % value

  2. 检查 count[mod] > 0

    • 如果有 → 用掉一个 → mex++
    • 如果没有 → 当前 mex 就是最大 MEX
int mex = 0;
while (true) {int mod = mex % value;if (count[mod] > 0) {count[mod]--;mex++;} else {break;}
}
return mex;

四、示例讲解

nums = [1, -10, 7, 13, 6, 8]
value = 5

1. 计算同余类

nummod = ((num%5)+5)%5
111
-1000
722
1333
611
833

统计:

count = [1, 2, 1, 2, 0]

2. 贪心生成 MEX

mexmex%5count[mex%5]操作结果
001用掉 → count[0]=0 → mex++=1
112用掉 → count[1]=1 → mex++=2
221用掉 → count[2]=0 → mex++=3
332用掉 → count[3]=1 → mex++=4
440没有 → 停止

最大 MEX = 4


五、时间复杂度

  • 遍历数组统计同余类:O(n)
  • 贪心计算 MEX:每次最多 O(n) 次(因为每个元素最多用一次)
  • 总复杂度:O(n)

空间复杂度:O(value)


六、总结

  1. 同余类是解决这类题目的关键:±value 的操作只改变数值,不改变余数类。
  2. 贪心 MEX:每次用掉余数类里一个元素生成对应的非负整数。
  3. 公式 (num % value + value) % value 保证余数非负,防止负数取模出错。
  4. 算法高效、易于实现。

🔗 参考代码(Java)

public int findSmallestInteger(int[] nums, int value) {int[] count = new int[value];for (int num : nums) {int r = ((num % value) + value) % value;count[r]++;}int mex = 0;while (true) {int mod = mex % value;if (count[mod] > 0) {count[mod]--;mex++;} else {break;}}return mex;
}

http://www.dtcms.com/a/491769.html

相关文章:

  • 『 数据库 』MySQL复习 - MySQL表CRUD操作全解析
  • 规范门户网站建设虚拟主机可以干什么
  • 完整博客教程:使用Lamini和Hugging Face进行大语言模型微调
  • HandlerThread是什么?为什么它会存在?
  • LeetCode 面试经典 150_栈_有效的括号(52_20_C++_简单)(栈+哈希表)
  • Wine 10.15 发布!Linux 跑 Windows 应用更丝滑了
  • 国外家居设计网站温州建设信息网站
  • PT2000 Dev Studio产生的微码解析一-微核简介
  • UVa 10228 A Star not a Tree?
  • 管理系统网站开发赚钱小程序
  • 五、安装配置hive
  • 自己给公司做网站5g天天奭5g天天运动网站代码
  • Kafka Queue: 完成 alterShareGroupOffsets Api
  • 网站开发流程 原型设计深圳世茂前海中心
  • Secret 与 ConfigMap配置资源管理
  • 泛微 企业网站建设计划网站开发后台框架
  • 做网站怎么添加图片企业营业执照查询系统入口
  • 大气污染扩散Calpuff模型应用
  • 【LeetCode热题100(44/100)】二叉树的右视图
  • 打工人日报#202510016
  • 青岛公司建设网站添加友情链接的技巧
  • 10.2.3 TrinityCore 网络模块封装
  • JS逆向-安全辅助项目接口联动JSRpc进阶调用BP插件autoDecode(下)
  • 试客网站程序源码南京网站制作步骤
  • 外贸网站用什么空间好福州网站建设优化
  • RoboIntern,一款自动化办公小助手
  • 前端中的受控组件与非受控组件:核心区别与实践指南
  • 逻辑600解析本03
  • 青海省建设厅建管处网站淘宝关键词排名优化
  • Day32_【 NLP _2.RNN及其变体 _(3) GRU】