数组中第K大的元素
题目描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。1
- 解析:采用优先队列进行解决,java中可以直接调用优先队列,但是面试官可能希望你用大顶锥进行求解.
- 代码部分:
public int findKthLargestTwo(int[] nums, int k) {
int heapSize = nums.length;
//构建大顶锥
buildMaxHeap(nums, heapSize);
//移除最大元素,并调整大顶锥
//通过交换,并减少堆的结点数,进行移除
for (int i = nums.length - 1; i >= nums.length - k + 1; i--) {
swap(nums, 0, i);
--heapSize;
maxHeapify(nums, 0, heapSize);
}
return nums[0];
}
//建堆
//遍历所有的根结点,从最底层开始调整
public void buildMaxHeap(int[] a, int heapSize) {
for (int i = heapSize / 2 - 1; i >= 0; i --) {
//建堆时从最后一层节点进行调整,当调整到根结点时,大顶锥已建立,
maxHeapify(a, i, heapSize);
}
}
//调整
//i是父节点,heapSize是堆的节点个数,a存储节点值的数组
//对索引i位置处的节点进行堆调整
public void maxHeapify(int[] a, int i, int heapSize) {
//思路:
// 找到较大节点值
// 将其与父节点进行交换
// 将交换后的点作为父节点进行调整
int l = i * 2 + 1;
int r = i * 2 + 2;
int largest = i;
if (l < heapSize && a[l] > a[largest]) {
largest = l;
}
if (r < heapSize && a[r] > a[largest]) {
largest = r;
}
if (largest != i) {
swap(a, i, largest);
//交换之后i位置出的值变为最大值,需要对largest处进行堆调整
maxHeapify(a, largest, heapSize);
}
}
//交换
public void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/ ↩︎