1、附上题目链接
- 排序 + 二分 思想:
215. 数组中的第K个最大元素
2、代码关键点详解
2.1 关键点:排序 + 二分 思想
2.1.1 数组中的第K个最大元素
class Solution {
/********************* 堆排 ************************/
// public int findKthLargest(int[] nums, int k) {
// PriorityQueue<Integer> minHeap = new PriorityQueue<>();
// for (int num : nums) {
// minHeap.add(num);
// while (minHeap.size() > k) {
// minHeap.poll();
// }
// }
// return minHeap.peek();
// }
/********************* 快排 ************************/
public int findKthLargest(int[] nums, int k) {
int left = 0, right = nums.length - 1;
k = nums.length - k;
while (left <= right) {
int p = partition(nums, left, right);
if (p == k) {
return nums[k];
} else if (p > k) {
right = p - 1;
} else if (p < k) {
left = p + 1;
}
}
return -1;
}
// 快排
public int partition (int[] nums, int lo, int hi) {
if (lo == hi) return lo;
int i = lo, j = hi + 1;
int pivot = nums[lo];
while (i <= j) {
while (nums[++i] < pivot) {
if (i == hi) break;
}
while (nums[--j] > pivot) {
if (j == lo) break;
}
if (i >= j) break;
swap(nums, i, j);
}
swap(nums, lo, j);
return j;
}
public void swap (int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
关键点1:找到第 k 个最大的元素
- 注意:需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
关键点2:快排思想
- 利用快排中
找 partition 值 + 二分
的思想来做这道题