news 2026/8/21 8:07:06

Kimi LeetCode LCP 24. 数字游戏 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode LCP 24. 数字游戏 Java实现

以下是 LeetCode LCP 24. 数字游戏的 Java 实现,核心思路是转换 + 中位数贪心 + 对顶堆:

```java
class Solution {
private static final int MOD = 1_000_000_007;

public int[] numsGame(int[] nums) {
int n = nums.length;
int[] ans = new int[n];

// 转换:令 a[i] = nums[i] - i
// 这样"nums[a]+1 == nums[a+1]"就等价于"a[a] == a[a+1]"
// 问题转化为:让前i个数相等的最小操作次数(绝对值之和最小化)
// 根据中位数贪心,当所有数等于中位数时,绝对值之和最小

// 大根堆:存储较小的一半,堆顶是较小一半的最大值
PriorityQueue<Long> left = new PriorityQueue<>((a, b) -> Long.compare(b, a));
// 小根堆:存储较大的一半,堆顶是较大一半的最小值(即中位数)
PriorityQueue<Long> right = new PriorityQueue<>();

long sumLeft = 0; // 左堆元素之和
long sumRight = 0; // 右堆元素之和

for (int i = 0; i < n; i++) {
long x = (long) nums[i] - i;

// 插入元素
if (right.isEmpty() || x >= right.peek()) {
right.offer(x);
sumRight += x;
} else {
left.offer(x);
sumLeft += x;
}

// 平衡两个堆的大小,保证 |left.size() - right.size()| <= 1
// 且 right.size() >= left.size()(中位数在右堆顶)
if (right.size() > left.size() + 1) {
long val = right.poll();
sumRight -= val;
left.offer(val);
sumLeft += val;
} else if (left.size() > right.size()) {
long val = left.poll();
sumLeft -= val;
right.offer(val);
sumRight += val;
}

long median = right.peek();
// 计算操作次数 = |所有元素到中位数的距离之和|
// = (median * left.size() - sumLeft) + (sumRight - median * right.size())
long cost = (median * left.size() - sumLeft)
+ (sumRight - median * right.size());
ans[i] = (int) (cost % MOD);
}

return ans;
}
}
```

核心思路

1. 问题转换
题目要求将 `nums[0..i]` 操作成满足 `nums[a]+1 == nums[a+1]` 的序列。这意味着最终序列形如 `x, x+1, x+2, ..., x+i`。

将每个元素减去其下标:`a[i] = nums[i] - i`,则条件转化为 `a[0] == a[1] == ... == a[i]`。

问题变为:让前 i 个数相等的最小操作次数(每次操作可以将某个数 +1 或 -1)。

2. 中位数贪心
对于一维数轴上的点,使所有点到某点的距离之和最小,该点即为中位数。因此目标值应取 `a[0..i]` 的中位数。

3. 对顶堆维护中位数
- 左堆(大根堆):存储较小的一半
- 右堆(小根堆):存储较大的一半,堆顶即为中位数
- 维护 `right.size() >= left.size()`,使得中位数始终在右堆顶

每次插入新元素后,通过调整堆的大小保持平衡,然后利用两个堆的元素和快速计算到中位数的距离之和。

复杂度

- 时间复杂度:O(N \log N),每次堆操作 O(\log N)
- 空间复杂度:O(N),两个堆的空间

示例验证

以 `nums = [3,4,5,1,6,7]` 为例:
- 转换后:`a = [3, 3, 3, -2, 2, 2]`
- i=0: [3] → 中位数 3,cost=0
- i=1: [3,3] → 中位数 3,cost=0
- i=2: [3,3,3] → 中位数 3,cost=0
- i=3: [3,3,3,-2] → 中位数 3,cost=|3-3|+|3-3|+|3-3|+|-2-3|=5
- i=4: 中位数 3,cost=5+1=6(-2 变 3 需 5 步,2 变 3 需 1 步)
- i=5: 中位数 3,cost=6+1=7

输出 `[0,0,0,5,6,7]` ✓

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 8:02:09

医学影像AI的自进化之路:基于GRPO与经验驱动的智能体技能发现

1. 项目概述&#xff1a;当医学影像遇上“自进化”智能体最近在AI与医学影像交叉领域&#xff0c;一个名为“Evolving Medical Imaging Agents via Experience-driven Self-skill Discovery”的研究方向引起了我的注意。这标题听起来有点绕&#xff0c;但拆解开来&#xff0c;核…

作者头像 李华
网站建设 2026/8/21 8:01:48

科研工作流中LLM的风险规避与工程化实践指南

如果你是一名科研工作者&#xff0c;或者正在从事与数据分析、文献调研、代码编写相关的技术工作&#xff0c;最近一定被一个词反复刷屏&#xff1a;LLM&#xff08;大语言模型&#xff09;。从ChatGPT到Claude&#xff0c;从Copilot到各类开源模型&#xff0c;它们被宣传为能极…

作者头像 李华
网站建设 2026/8/21 7:55:10

RS罗德与施瓦茨SGS100A 紧凑型全集成式SGMA射频源

R&SSGS100A 是罗德与施瓦茨推出的紧凑型全集成式SGMA射频源&#xff0c;专为自动化测试系统设计&#xff0c;兼具连续波信号源和矢量信号发生器功能。核心功能定位它可以灵活切换两种工作模式&#xff1a;作为连续波信号源时可充当高稳定性本振&#xff0c;用于移动通信标准…

作者头像 李华
网站建设 2026/8/21 7:53:09

多语言文案测试-脚本扫描小工具

多语言文案测试-全量页面脚本扫描小工具 使用方法&#xff1a;&#x1f4a1; 提示&#xff1a;在 Console 中按 ↑ 可以调出上一次执行的代码&#xff0c;切换语言后直接按回车即可重复扫描&#xff0c;不用重新粘贴。 切换到 English → 粘贴脚本 → 回车 → 记录结果 切换到 …

作者头像 李华
网站建设 2026/8/21 7:52:50

AI智能体权限控制新范式:基于身份与属性的动态授权架构实践

1. 项目概述&#xff1a;当AI智能体需要“持证上岗” 最近在折腾AI智能体&#xff08;AI Agents&#xff09;的落地应用&#xff0c;一个绕不开的坎就是权限控制。你训练了一个很聪明的客服机器人&#xff0c;它能查订单、能改地址&#xff0c;但你肯定不希望它一不小心把隔壁…

作者头像 李华