算法从入门到放弃——第十期 归并

本文讨论了一道面试题,涉及如何找出CPU使用率最高的时间段。问题可以通过有序数组的多路归并来解决,包括使用循环遍历、最小堆和胜者树等方法。虽然面试中提出的解决方案可能不够最优,但提出了从不同角度思考问题的思路,如时间复杂度的优化。文章探讨了各种方法的时间复杂度,包括遍历和堆排序的解决方案,并引发了对于最优解的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇上一个某宇宙厂的面试题:

进程pid 进程开始时间 进程结束时间 cpu使用率

1          1:00                 2:00              10

2          1:20                 3:00              15

3          2:30                 4:00              30

题目类似这样,要你求cpu使用率最高的时间段

题目其实不难,想要实现有简单的方式,有难的方式。拿到之后总感觉两个字:做过

抽象之后大致就是一个有序数组的归并,类似 力扣88 这样的,

按理来说不是什么难问题,但是面试官让我所处思路和时间复杂度之后,我自己迟疑了:并不是最优,刷题的时候AC过了没思考最优解法,心中无墨水,有苦说不出。

在这把归并解决一下,实现先放一放,说说思路

归并的方式很多,最简单的两两归并,这当然不能算是多路归并

真正意义上的多路归并:

1、循环遍历找最小

就比如链表

1->2->3

2->3->5

2->2->4

循环取头就可以了,那么时间复杂度是遍历所有的元素,m*n

2、最小堆

建立最小堆,每次从中取最小即可,时间复杂度nlogn,这里我们也说过,取堆顶求最小,全塞入最小堆,求最大topk

3、胜者数

建立胜者树,每次取胜者就可以了,和最小堆一样

实现

//TODO,实现先放放,有时间写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值