上述算法功能:
输入一系列可重复的数, 找出第K大的数, 重复数字也算作1个.
例如: 2 2 1 4, 第3大的数字是2, 而不是1.
思想:需要找第K大数,只需要建立一个容量为K的最小堆,初始化所有元素都无穷小.
每次读取一个数据,
如果这个数据比堆顶元素大,那么它可以替代堆顶,并用updateHeap维持最小堆的性质.
如果这个数据比堆顶元素小,那么它一定小于所有堆内的元素,所以不必操作.
如果这个数据和堆顶元素一样大, 由于堆顶元素是堆内最小的元素, 所以不必操作,因为如果插入一个与堆顶一样大的元素去替换某一个结点,被替换的结点不会比插入的元素小,所以不能替换.
所以算法主要就是围绕一个最小堆来做的,思想很简单.
稍后补充另一个算法,在此基础上不计算重复的第K大元素.
这个算法的思想是利用空间换时间,当然空间也是相当的小....只要101个位就可以了.
逐次输入成绩,给成绩对应的位做标记. 最后从100分开始计数,一旦计数到达3次,就打印出那个成绩就是第3(不重复)大成绩.