Leetcode 215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,它是数组有序排列后的第 k 个最大元素,而不是第 k 个不同元素。
例如,
给出 [3,2,1,5,6,4]
和 k = 2,返回 5。
注意事项:
你可以假设 k 总是有效的,1 ≤ k ≤ 数组的长度。
思路 1 堆
可以先取k个元素,放到一个数组中,然后把数组转换成最小堆。之后遍历剩下的全部元素,和最小堆的根进行比较。如果比根要大,则替换根,之后把数组重新转换成最小堆。遍历完成后,最小堆堆根即为第 k 大的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class Solution {
public static int findKthLargest(int[] nums, int k) { int[] heap = new int[k]; System.arraycopy(nums, 0, heap, 0, k); for (int i = k / 2 - 1; i >= 0; i--) { adjest(heap, i); } for (int i = k; i < nums.length; i++) { if (heap[0] < nums[i]) { heap[0] = nums[i]; adjest(heap, 0); } } return heap[0]; }
private static void adjest(int[] heap, int i) { int temp = heap[i]; int length = heap.length; for (int k = i * 2 + 1; k < length; k = 2 * k + 1) { if (k + 1 < length && heap[k + 1] < heap[k]) { k++; } if (temp <= heap[k]) { break; } else { heap[i] = heap[k]; i = k; } } heap[i] = temp; } }
|
题目链接
Leetcode-cn
Leetcode