描述:有N个长度不一样的数组,每个数组都是有序的,找出这个N个数组的TopK
要求:
- 如果所有数组的元素个数之和小于k,则从大到小打印所有的数
- 时间复杂度为
解答:利用堆结构和堆排序的过程完成
- 构建一个大小为N的大根堆,每次把每个数组中最后一个值加入到堆中,同时调整堆,使其满足大根堆的定义
- 建好的堆结构堆顶元素就是所有数组中最大的一个值,打印此值
- 假设堆顶元素来自a数组的i位置,那么接下来就用a[i-1]替换堆顶,然后从堆的头部开始调整堆使其变为大根堆
- 这样每次都可以得到一个堆顶元素max,整体打印K次即可
- 在重复步骤3的过程中,如果max来自的哪个数组(假设是a)已经没有元素,也就是max是a[0],那么就把当前堆结构中最后一个值放到头部,然后堆的大小减一,一次从对的头部开始调整堆,使其重新变为大根堆
- 直到打印了k个数,过程结束
复杂度分析:
初始化堆的复杂度为:,重建堆的时间复杂度为: