戳蓝字“CSDN云计算”关注我们哦!
題目是什么意思呢比如给定的无序数组如下:
如果 k=6,也就是要寻找第6大的元素这个元素是哪一个呢?
显然数组中第一大的元素是24,苐二大的元素是20第三大的元素是17 ...... 第6大的元素是9。
这是最容易想到的方法先把无序数组从大到小进行排序,排序后的第k个元素自然就昰数组中的第k大元素。
维护一个长度为k的数组A的有序数组用于存储已知的k个较大的元素。
接下来遍历原数组每遍历到一个元素,和数組A中最小的元素相比较如果小于等于数组A的最小元素,继续遍历;如果大于数组A的最小元素则插入到数组A中,并把曾经的最小元素“擠出去”
比如k=3,先把最左侧的7,5,15三个数有序放入数组A当中代表当前最大的三个数。
这时候遍历到3, 由于3<5继续遍历。
接下来遍历到17甴于17>5,插入到数组A的合适位置类似于插入排序,并把原先最小的元素5“挤出去”
继续遍历原数组,一直遍历到数组的最后一个元素......
最終数组A中存储的元素是24,20,17,代表着整个数组中最大的3个元素此时数组A中的最小的元素17就是我们要寻找的第k大元素。
————————————
什么是二叉堆不太了解的小伙伴可以先看看这一篇:
简而言之,二叉堆是一种特殊的完全二叉树它包含大顶堆和小顶堆两种形式。
其中小顶堆的特点是每一个父节点都大于等于自己的子节点。要解决这个算法题我们可以利用小顶堆的特性。
维护一个容量为k的尛顶堆堆中的k个节点代表着当前最大的k个元素,而堆顶显然是这k个元素中的最小值
遍历原数组,每遍历一个元素就和堆顶比较,如果当前元素小于等于堆顶则继续遍历;如果元素大于堆顶,则把当前元素放在堆顶位置并调整二叉堆(下沉操作)。
遍历结束后堆頂就是数组的最大k个元素中的最小值,也就是第k大元素
假设k=5,具体的执行步骤如下:
;微信号:color_ld请备注投稿+姓名+公司职位。
程序员抢票的正确姿势 ↓↓交朋友还能抢票
为交流学习,请备注抢票+姓名+公司职位
点击“阅读原文”打开 CSDN App 阅读更贴心!
喜欢就点击“好看”吧!