这篇文章是LeetCode上面堆相关的一些题目,堆相关的题目都比较复杂,难度系数都不低。

  215、在未排序的数组中找到第 k 个最大的元素

//请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 
//
// 示例 1: 
//
// 输入: [3,2,1,5,6,4] 和 k = 2
//输出: 5
// 
//
// 示例 2: 
//
// 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
//输出: 4 

  这个题目是求第k大的元素,那么很容易就能想到比较经典的,从海量数据中求top100这种题目。常规思路就是使用一个小顶堆,来 保存元素即可,具体来说,就是构建一个Java中的优先队列,依次将元素入队;如果队列中的元素个数大于K了,则poll出队,这就去除了队列 中最小的元素,最后剩下的就是数组中最大的k个元素,那么再poll一次,就是第k大的了,代码简洁而且思路清晰。

  其实除了小顶堆以外,还可以利用快排的思想,将整个数组进行分区,选择一个pivot,左边都是大于它的元素,右边都是小于它的元素,通 过比较k和左边元素的个数的大小关系,来决定下一次查找是在左边还是右边的数组中递归进行,本质上就是使用快排中的那个partition()函 数。

  264、编写一个程序,找出第 n 个丑数

// 丑数就是质因数只包含 2, 3, 5 的正整数。 
//
// 示例: 
//
// 输入: n = 10
//输出: 12
//解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 
//
// 说明: 
//
// 
// 1 是丑数。 
// n 不超过1690。 

  这道题目的tag是堆、数学和动态规划,还对应了一道easy的题目,是判断一个数是否是丑数,因为之前做过,所以比较容易就想到了, 使用一个数组来保存从小到大的丑数,丑数都是由1、2、3、5累积相乘得到的。那么就写一套生成丑数的方法,使用三个指针,还是比较容易 理解的。