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.
Example 1:
Input: [3,2,1,5,6,4] and k = 2
Output: 5
Example 2:
Input: [3,2,3,1,2,4,5,5,6] and k = 4
Output: 4
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。.
找出第K大的数字。
用最大堆实现,堆的最顶元素,肯定是最大的。
class Solution {
public int findKthLargest(int[] nums, int k) {
int []heap = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
buildHeap(heap, nums[i], i);
}
int size = heap.length;
// 出堆k-1次,每次出完后保持堆状态
for (int i = 1; i < k; i++) {
swap(heap, 0, size - 1);
size--;
peek(heap, size);
}
return heap[0];
}
void peek(int []heap, int heapSize) {
int i = 0;
while (i * 2 + 1 < heapSize) {
int left = i * 2 + 1;
int right = i * 2 + 2;
if (right >= heapSize) {
if (heap[i] < heap[left]) {
swap(heap, i , left);
}
break;
}
if (heap[i] >= heap[left] && heap[i] >= heap[right]) {
break;
}
if (heap[i] < heap[left] && heap[left] >= heap[right]) {
swap(heap, i ,left);
i = left;
continue;
}
if (heap[i] < heap[right] && heap[right] >= heap[left]) {
swap(heap, i ,right);
i = right;
continue;
}
}
}
void buildHeap(int[] heap, int num, int i) {
heap[i] = num;
// 堆顶元素是最大的,且每个i都大于i * 2 + 1与 i * 2 + 2
while (heap[i] > heap[(i - 1) / 2]) {
int tmp = heap[i];
heap[i] = heap[(i - 1) / 2];
heap[(i - 1) / 2] = tmp;
i = (i - 1) / 2;
}
return;
}
void swap(int[] heap, int a, int b){
int tmp = heap[a];
heap[a] = heap[b];
heap[b] = tmp;
}
}