数组中的第K个最大元素
在未排序的数组中找到第 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 总是有效的,且 1 ≤ k ≤ 数组的长度。
解析:注意这道题中说的是k个元素是可以相同的,那么是可以用小顶堆来做的。
假设小顶堆的大小为k,那么堆顶就为第k个元素
时间复杂度为 新建堆的大小1/2 * k * logk
遍历 (n - k)*logk
总时间复杂度为nlogk的级别
class Solution { public int findKthLargest(int[] nums, int k) { int[] arr = new int[k]; int len = nums.length; for (int i = 0; i < k; i++) { arr[i] = nums[i]; } init(arr); for (int i = k; i < len; i++) { if (nums[i] < arr[0]) { continue; } else { arr[0] = nums[i]; down(arr, 0); } } return arr[0]; } public void init(int[] data) { int len = data.length; for (int i = len/2 - 1; i >= 0; i--) { down(data, i); } } public void down(int[] data, int root) { int head = root; int headval = data[root]; int left = head * 2 + 1; int right = left + 1; int next = left; int len = data.length; while (left < len) { if (right < len && data[right] < data[left]) { next = right; } if (data[next] < headval) {//注意这里,一直是和headval做比较的 data[head] = data[next]; } else { break; } head = next; left = head * 2 + 1; right = left + 1; next = left; } data[head] = headval; } }