解题思路:对元素组从大到小排序,然后找到对应K-1下标的值返回。归并排序时间复杂度O(nlog(N)),空间复杂度O(N)
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
//因为保证答案存在,故不用判断是否符合条件
//1、对元素组排序
sort(a, 0, n - 1);
return a[K - 1];
}
private void sort(int[] a, int left, int right) {
if (left >= right) {
return;
}
int mid = (left + right) >> 1;
sort(a, left, mid);
sort(a, mid + 1, right);
merge(a, left, mid, right);
}
private void merge(int[] a, int left, int mid, int right) {
int[] result = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
result[k++] = a[i] < a[j] ? a[j++] : a[i++];
}
while (i <= mid) {
result[k++] = a[i++];
}
while (j <= right) {
result[k++] = a[j++];
}
for (int index = 0; index < result.length; index++) {
a[left++] = result[index];
}
}
}
解法二:用系统自带的排序
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
Arrays.sort(a);
return a[n-K];
}
}
解法三:大根堆
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
PriorityQueue<Integer> maxQueue = new PriorityQueue<>((o1, o2)->o2 - o1);
for (int i = 0; i < n; i++) {
maxQueue.offer(a[i]);
}
int result = 0;
for (int i = 0; i < K; i++) {
result = maxQueue.poll();
}
return result;
}
}
解法四:小根堆
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
PriorityQueue<Integer> maxQueue = new PriorityQueue<>((o1, o2)->o1 - o2);
for (int i = 0; i < n; i++) {
maxQueue.offer(a[i]);
}
int result = 0;
for (int i = 0; i <= n - K; i++) {
result = maxQueue.poll();
}
return result;
}
}