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

Leetcode第165场双周赛题目详解+复盘

Q1.大于平均值的最小未出现正整数

https://leetcode.cn/contest/biweekly-contest-165/problems/smallest-absent-positive-greater-than-average/description/

class Solution {public int smallestAbsent(int[] nums) {double sum = 0;for (int num : nums) {sum += num;}double avg = sum / nums.length;int start = Math.max((int) avg + 1, 1);Set<Integer> set = new HashSet<>();for (int num : nums) {if (num > 0) {set.add(num);}}for (int x = start; ; x++) {if (!set.contains(x)) {return x;}}}
}

这道题其实还是比较简单的,首先就是先算出平均数,然后开一个容器存储原数组中所有大于0的正整数,最后就是从start开始进行查找,找到第一个不包含在容器里面的正整数就行了

要注意的就是因为题目可能会出现负数,所以需要处理一下平均数加1 之后是否还是小于0的情况

Q2.使库存平衡的最少丢弃次数

https://leetcode.cn/contest/biweekly-contest-165/problems/minimum-discards-to-balance-inventory/description/

class Solution {public int minArrivalsToDiscard(int[] arrivals, int w, int m) {int res = 0;int[] cnt = new int[100001]; // 每个样品的数量boolean[] keep = new boolean[arrivals.length]; // 对应天数是否保留for (int i = 0; i < arrivals.length; i++) {// 是否可能出现超过窗口大小if (i >= w) {// 判断是否出现超过窗口大小int beforeDay = i - w;if (keep[beforeDay]) {cnt[arrivals[beforeDay]]--;}}// 判断当前物品是否已经超过规定大小了if (cnt[arrivals[i]] >= m) {// 直接跳过这一天keep[i] = false;res++;} else {keep[i] = true;cnt[arrivals[i]]++;}}return res;}
}

这道题给的数据量不大,可以直接开一个数组表示哈希表(只统计窗口内数量),表示每一个物品的数量,另外开一个布尔数组表示对应天数是否保留,然后就是进入循环,判断到当前保留的天数大于窗口,就要对左边界的商品移出哈希表,不占用数量

然后就是判断数量是否超过规定大小,超过的话就抛弃当天的,否则加入

注意:抛弃的只能是当前的,超过窗口大小的那些只能移出哈希表,不能设置为不保留

Q3.生成赛程

https://leetcode.cn/problems/generate-schedule/description/

class Solution {public int[][] generateSchedule(int n) {// 构成不了if (n < 5) return new int[0][0];int[][] ans = new int[n * (n - 1)][]; // 大小就是 (n(n-1) / 2) * 2int idx = 0;// 假如说间隔是d的话,那先处理间隔是2到n-2的那些for (int d = 2; d <= n - 2; d++) {for (int i = 0; i < n; i++) {ans[idx++] = new int[]{i, (i + d) % n};}}// 构造间隔是1和间隔是n-1的for (int i = 0; i < n; i++) {ans[idx++] = new int[]{i, (i + 1) % n};ans[idx++] = new int[]{(i + n - 1) % n, (i + n - 2) % n};}return ans;}
}

解题思路:这道题是这场比赛中最难的,我们使用构造法来解决就行了。

首先就是 n < 5 的情况是一定没办法构成的,这一点可以自己尝试证明一下。

然后就是构建之后有多少个呢?就是 2Cnn-1

然后我们可以写出不同间隔(d)的构建情况

可以发现我们可以先处理 d为 2~n-2的这部分,因为直接构建就行不会出现冲突

但是d为n-1和d=1这两个会有冲突,可以考虑交错组合,但是还是会出现冲突,因此需要把 d=n-1的最后一个移到最前面,再进行交叉组合就不会了,可以自己模拟一下


 

Q4.子序列最大 XOR 值

https://leetcode.cn/problems/maximum-xor-of-subsequences/description/

class Solution {public int maxXorSubsequences(int[] nums) {// 定义线性基,最多处理 30 位(对应 int 的低 30 位,从第 0 位到第 29 位)int[] p = new int[30]; // 全部初始化为 0for (int x : nums) {int cur = x;for (int i = 29; i >= 0; i--) {// 第i位是否是1if (((cur >> i) & 1) == 1) {if (p[i] == 0) {p[i] = cur;break;} else {cur ^= p[i];}}}}// 通过线性基计算最大异或和int ans = 0;for (int i = 29; i >= 0; i--) {if ((ans ^ p[i]) > ans) {ans ^= p[i];}}return ans;}
}

这道题就是直接使用线性基就行了

题目说的那么多,其实可以看成就是从很多个数里选若干个数异或起来,得到的最大值是多少

由于暴力枚举所有子集不可行(复杂度 O(2^n)),我们采用线性基(Linear Basis)来高效解决。

线性基是一种数据结构,它可以从原数组中提取出一组极简的基向量(最多 30 个),这些基:彼此线性无关(不能互相表示)能通过异或组合表示出原数组中所有子集的异或和

我们开一个大小为 30 的数组 p[],从高位到低位依次处理每个数,将其插入线性基:

如果当前位还没有基,则将该数作为基存入;

如果该位已有基,则用基去消去当前数的这一位,继续处理低位;

若最终该数被消为 0,则说明它是冗余的,无需插入。

插入完成后,我们遍历线性基,采用贪心策略从高位到低位尽可能让结果为 1,从而求出最大异或和。

线性基的本质,就是去冗余、去重复、保留线性无关的基,从而高效表示所有可能的异或组合。


文章转载自:

http://QUdrKJpo.hgwsj.cn
http://MA99cPhG.hgwsj.cn
http://SMjBgTY9.hgwsj.cn
http://mhcg3fFA.hgwsj.cn
http://rVpqJwQ2.hgwsj.cn
http://IMd9bArw.hgwsj.cn
http://kZn3gV2z.hgwsj.cn
http://ee0tFI7r.hgwsj.cn
http://5MJCj8dx.hgwsj.cn
http://9poUiUBb.hgwsj.cn
http://fr79Mg9g.hgwsj.cn
http://Ryk3ctol.hgwsj.cn
http://WjWYzlid.hgwsj.cn
http://UXW6rYqv.hgwsj.cn
http://9XFztNBq.hgwsj.cn
http://pQSWdGU8.hgwsj.cn
http://WJghdMlH.hgwsj.cn
http://pLyoDZq3.hgwsj.cn
http://i48PlIJd.hgwsj.cn
http://OZymP4P7.hgwsj.cn
http://wdCPXGTg.hgwsj.cn
http://UZ5dsQ6n.hgwsj.cn
http://6MC7rhJH.hgwsj.cn
http://KMB0gvGf.hgwsj.cn
http://Iu4Lzflw.hgwsj.cn
http://cMxbvWqL.hgwsj.cn
http://aVvLcXup.hgwsj.cn
http://sT4Hhacv.hgwsj.cn
http://9m9USfyE.hgwsj.cn
http://r7jn2qN9.hgwsj.cn
http://www.dtcms.com/a/383852.html

相关文章:

  • rt1180 rt1180处理器ethercat具体技术介绍
  • Sugov 关于频率变化
  • 多语言编码Agent解决方案(6)-部署和使用指南
  • React 原理篇 - React 新架构深度解析
  • Flowgorith,一款图形化编程入门工具
  • LeetCode 674.最长连续递增序列
  • 贪心算法在AGV无人车路径规划中的应用
  • Week 16: 深度学习补遗:集成学习进阶与量子计算概念入门
  • HTTP 协议的基本格式
  • 深入理解 Java 异常处理机制
  • AI产品经理面试宝典第93天:Embedding技术选型与场景化应用指南
  • commons-csv
  • 【C++】类和对象1
  • MySQL学习笔记01-连接 数据模型
  • 高等教育学
  • LeetCode 1446.连续字符
  • 力扣966 元音拼写器(三个哈希表解法)详解
  • godot+c#操作sqlite并加解密
  • 利用DeepSeek实现服务器客户端模式的DuckDB原型
  • 使用Conda创建Python环境并在PyCharm中配置运行项目
  • 【项目】-Orange Pi Zero 3 编译内核测试LED
  • 【知识点讲解】Multi-Head Latent Attention (MLA) 权威指南
  • 《人性的弱点:激发他人活力》读书笔记
  • 类的封装(Encapsulation)
  • 上下文管理器和异步I/O
  • Python中的反射
  • 大模型对话系统设计:实时性与多轮一致性挑战
  • 电脑优化开机速度的5种方法
  • Vue3基础知识-Hook实现逻辑复用、代码解耦
  • 家庭宽带可用DNS收集整理和速度评测2025版