题目描述
题目分析
- 这道题简而言之,就是将数组排序,然后取第K个大的值
- 如果数组升序排序,就是取倒数第K个值
- 如果数组降序排序,就是直接取第K个值即可
- 《官方题解》
解法分析
-
这道题重点在数组排序
-
可以直接使用
Array.sort()
来对数组进行排序,时间复杂度 O(NlogN),空间复杂度 O(1) -
堆排序:时间复杂度 O(NlogK),空间复杂度 O(K)
-
快速选择:时间复杂度 O(N),空间复杂度 O(1)
代码
- 排序
class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length - k];
}
}
- 堆排序
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<>(); // 小顶堆
for (int val : nums) {
pq.add(val);
if (pq.size() > k) // 维护堆的大小为 K
pq.poll();
}
return pq.peek();
}
- 快速排序选择
public int findKthLargest(int[] nums, int k) {
k = nums.length - k;
int l = 0, h = nums.length - 1;
while (l < h) {
int j = partition(nums, l, h);
if (j == k) {
break;
} else if (j < k) {
l = j + 1;
} else {
h = j - 1;
}
}
return nums[k];
}
private int partition(int[] a, int l, int h) {
int i = l, j = h + 1;
while (true) {
while (a[++i] < a[l] && i < h) ;
while (a[--j] > a[l] && j > l) ;
if (i >= j) {
break;
}
swap(a, i, j);
}
swap(a, l, j);
return j;
}
private void swap(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}