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

DeepSeek LeetCode 3266. K 次乘运算后的最终数组 II Java实现

这道题是 LeetCode 3266,和 3264 的区别在于 k 的范围扩大到 1e9,直接堆模拟会超时,需要用数学规律优化。

核心思路

当数组中 所有元素都大于当前最大值 时,后续操作会进入稳定循环:每次操作选择最小的元素,乘完后它变成最大,n 次操作正好轮完一轮。

因此分两阶段处理:

1. 模拟阶段:用最小堆模拟,直到堆顶元素 × multiplier > 当前最大值或 k 用完
2. 批量阶段:剩余操作均匀分配到每个元素,用快速幂计算

Java 实现

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

public int[] getFinalState(int[] nums, int k, int multiplier) {
int n = nums.length;

// multiplier = 1 时数组不变
if (multiplier == 1) return nums;

// 最小堆:[值, 索引]
PriorityQueue<long[]> pq = new PriorityQueue<>((a, b) ->
a[0] != b[0] ? Long.compare(a[0], b[0]) : Long.compare(a[1], b[1])
);

int maxVal = 0;
for (int i = 0; i < n; i++) {
maxVal = Math.max(maxVal, nums[i]);
pq.offer(new long[]{nums[i], i});
}

// 阶段1:模拟直到堆顶乘 multiplier 后超过 maxVal
while (k > 0 && pq.peek()[0] < maxVal) {
long[] cur = pq.poll();
cur[0] *= multiplier;
pq.offer(cur);
k--;
}

// 阶段2:剩余操作均匀分配
// 此时堆中元素已有序,取出排序
long[][] arr = new long[n][2];
for (int i = 0; i < n; i++) {
arr[i] = pq.poll();
}
// 按值排序(值相同时按索引)
Arrays.sort(arr, (a, b) -> a[0] != b[0] ? Long.compare(a[0], b[0]) : Long.compare(a[1], b[1]));

int base = k / n; // 每个元素至少乘 multiplier^base
int extra = k % n; // 前 extra 个元素多乘一次

int[] result = new int[n];
for (int i = 0; i < n; i++) {
long val = arr[i][0] % MOD;
int idx = (int) arr[i][1];
int exp = base + (i < extra ? 1 : 0);
result[idx] = (int) (val * fastPow(multiplier, exp) % MOD);
}

return result;
}

// 快速幂
private long fastPow(long x, int n) {
long res = 1;
while (n > 0) {
if ((n & 1) == 1) {
res = res * x % MOD;
}
x = x * x % MOD;
n >>= 1;
}
return res;
}
}
```

复杂度分析

· 时间复杂度:O(n log n)
· 堆化 O(n)
· 模拟阶段最多 O(n) 次堆操作
· 排序 O(n log n)
· 空间复杂度:O(n)

示例验证

```java
// 示例
int[] nums = {2, 1, 3, 5, 6};
int k = 5, multiplier = 2;
// 输出: [8, 4, 6, 5, 6]
```

这个解法利用了数学规律将 O(k) 的模拟优化为 O(n log n),可以高效处理 k 高达 1e9 的情况。

http://www.jsqmd.com/news/1021529/

相关文章:

  • jina-embedding-l-en-v1性能优化指南:NPU加速与批量处理技巧
  • 重新定义网页资源获取:猫抓浏览器扩展如何简化多媒体内容管理
  • 终极解决方案:3分钟让《模拟人生1》完美适配现代宽屏显示器
  • 输电线路继电保护仿真实战:从模型构建到闭环测试全解析
  • 激活函数为什么是神经网络的必要条件而非可选项
  • Appium UiAutomator2 Driver自定义扩展开发:如何为Android自动化测试添加新功能
  • 3分钟掌握Illustrator批量替换:设计师必备的效率革命工具
  • DLSS Swapper完整指南:免费开源工具轻松管理游戏DLSS版本,提升显卡性能表现
  • Strix Halo核显跑Qwen3-Coder 30B实战指南
  • 5分钟掌握Silk音频格式转换:轻松解决微信QQ语音播放难题
  • Gemma 4端侧推理实战:手机跑大模型的工程真相
  • NXP HSCMP高速比较器:七大工作模式、寄存器配置与电机控制实战
  • 2026年AI模型天选时刻:闭源旗舰VS开源顶流,645倍价格差如何选最适合你的“它“?
  • OpenAI Plugins生物科学研究:生命科学研究插件的AI应用场景
  • 2026年保姆级教程:录音转文字在线工具推荐,免费方法一看就会
  • 终极指南:Windows安卓驱动一键安装工具,告别黄色感叹号!
  • MSC8156 AMC硬件架构深度解析:以太网、复位与电源配置实战
  • 三步解锁Microsoft 365完整功能:Ohook开源方案详解
  • 深入Bottleneck T5架构:jeffding/contra-bottleneck-t5-large-wikipedia-openmind的跨注意力门控机制原理解析
  • Windows 11 LTSC 系统如何快速找回微软应用商店?完整指南告诉你
  • 免费在线SQLite查看器:浏览器直接打开数据库文件的终极指南
  • 个人数字身份管理实践:从信息碎片化到分层安全体系
  • 汇编与接口实验:从软件到硬件的深度探索与实战指南
  • Lathe CLI命令大全:掌握lathe serve、skills install等必备指令
  • ppt模板_0094_红色曲线
  • Codex 2026实战指南:TRAE Solo本地化AI编程协作者部署与调用
  • Table Agent:自然语言驱动的无代码数据分析工作流
  • 一文读懂Agent、harness、Loop等概念
  • 临界渗流与随机簇模型:相变理论与应用
  • Genymotion ARM翻译工具终极指南:解决Android模拟器ARM指令兼容性难题