竞赛题优化:解决堆方法超时的考试时间处理问题
求优化考试时间递减操作的算法(O(nlogn)复杂度)
我有一个列表 examTime = [3, 3, 6, 3, 9],给定参数 a = 3,b = 2。
约束条件
- 数组长度:1 ≤ len(examTime) ≤ 10^5
- 元素范围:1 ≤ examTime[i] ≤ 10^9
- 参数范围:1 ≤ b < a ≤ 10^9
任务要求
需要重复执行以下操作,直到数组中所有元素都≤0:每次找到数组中的最大值,将其减去a,同时将数组中其他所有元素减去b。
操作示例
步骤1:最大值9减3,其余元素减2,得到新数组:[1, 1, 4, 1, 6]
步骤2:最大值6减3,其余元素减2,得到新数组:[-1, -1, 2, -1, 3]
步骤3:最大值3减3,其余元素减2,得到新数组:[-3, -3, 0, -3, 0]
完成所有操作共需要3次。
当前问题
要求算法时间复杂度为O(nlogn),我原本用堆来实现:每次弹出最大值处理,再给堆中所有元素减b,但面对大数据量(比如下面的测试用例)时程序超时,有没有更高效的解决方法?
补充信息
原堆实现算法
func minOps(examTime, x, y) { // 转负数用最小堆模拟最大堆 1. 将 examTime 中所有元素转为负数 2. 执行堆化操作 3. 循环直到堆为空: popped = -从堆中弹出元素 - x 遍历堆中所有元素,每个元素减去y,若结果≤0则弹出堆 如果 popped 大于0,将其压入堆中 4. 每次循环后操作计数加1 }
超时测试用例
examTime = [1000000000] * 100000, a = 10000, b = 100
内容的提问来源于stack exchange,提问作者AS Scorpio
相关产品推荐
相关产品推荐

