不符合题意:时间复杂度为O(NlogN)
class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length;
return nums[n - k];
}
}
方法二:快速排序
分为两步:
- 定哨兵
- 将比哨兵小的值放在左边,比哨兵大的值放在右边
然后对哨兵两边的子数组再进行快速排序。
使用随机数来定哨兵可以防止特定数列使算法退化。
class Solution {
public int findKthLargest(int[] nums, int k) {
List<Integer> numsList = new ArrayList<>();
for (int num : nums) {
numsList.add(num);
}
return QuickSort(numsList, k);
}
public int QuickSort(List<Integer> nums, int k) {
Random rand = new Random();
// 生成[0, nums.size())的一个随机数(索引)
int pivot = nums.get(rand.nextInt(nums.size()));
List<Integer> bigger = new ArrayList<>();
List<Integer> equal = new ArrayList<>();
List<Integer> smaller = new ArrayList<>();
for (int num : nums) {
if (num < pivot) smaller.add(num);
else if (num > pivot) bigger.add (num);
else equal.add(num);
}
// 第k大的元素在bigger数组内
if (k <= bigger.size()) return QuickSort(bigger, k);
// 第k大的元素在smaller数组内
if (bigger.size() + equal.size() < k) return QuickSort(smaller, k - (bigger.size() + equal.size()));
// 是哨兵
return pivot;
}
}