215. 数组中的第K个最大元素

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

输入输出

1
2
3
4
5
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

基本思路

方法一:快排之后如果第[nums.length-k]位置的放好就返回

方法二:堆排序 善用 PriorityQueue

java实现

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
46
// 方法一 时复O(n) 空复O(logn)
class Solution {
Random rand = new Random();
public int findKthLargest(int[] nums, int k) {
return QuickSort(nums, k, 0, nums.length-1);
}

public int QuickSort(int[] nums, int k, int low, int high) {
int index = rand.nextInt(high-low+1) + low;
int flag = nums[index];
nums[index] = nums[low];
int i = low, j = high;
while(i < j){
while(i < j && nums[j] >= flag) j--;
nums[i] = nums[j];
while(i < j && nums[i] <= flag) i++;
nums[j] = nums[i];
}
nums[i] = flag;
if(i == nums.length-k) return nums[i];
else if(i < nums.length-k) return QuickSort(nums, k, i+1, high);
else return QuickSort(nums, k, low, i-1);
}
}

// 方法二 时复O(nlogk) 遍历数组O(n) 堆内元素调整O(logk) 空复O(k)
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for (int num : nums) {
heap.add(num);
if (heap.size() > k) {
heap.poll();
}
}
return heap.peek();
}
}
// [3,2,1,5,6,4]
// 队列内:3
// 队列内:2 3
// 队列内:1 2 3 poll完:2 3
// 队列内:2 3 5 poll完:3 5
// 队列内:3 5 6 poll完:5 6
// 队列内:4 5 6 poll完:5 6
// 最后peek 出来5