问题描述
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
翻译过来:给你一个无序的整数数组,求其中第k大的数。比如下面的一组输入(第一行)和输出(第二行):
Input: [3,2,1,5,6,4] and k = 2
Output: 5
代码及其思路
这种题还是比较简单的,一般有两种思路:
- 先排序然后依次输出,直到第k个,这种思路一般借助快排,时间复杂度O(nlog(N)),比较常规;
- 第二种思路是建立最大堆或者最小堆,一种优先级队列的方式,遍历复杂度O(N)*堆调整复杂度O(log(N)),所以总的复杂度还是O(Nlog(N)).
我比较喜欢自己设计最大堆最小堆,所以这里定义了一个最大堆来解决。详细思路可以参考代码中的注释,写的比较清楚了。本来可以一次性AC的,由于偷懒,所以第一次提交,报错:数组下标越界!(excuse me?)
经过思考,想来应该是偷懒将MaxHeap类的私有变量用static修饰,导致在系统测试时,每次nextIndex的值都在递增,而不是新的一次用例从初始值开始(静态类变量),所以在构造函数里面每次初始化一下AC了!!!
特此记录!提醒自己时刻对代码保持敬畏之心!!
代码如下:
class Solution {
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
MaxHeap maxHeap = new MaxHeap(len);
for (int val : nums) {
maxHeap.push(val);
}
for (int i = 0; i < k - 1; i++) {
maxHeap.pop();
}
return maxHeap.pop();
}
}
class MaxHeap {
private stati