力扣 215 .数组中的第K个最大元素
文章目录
- 题目介绍
- 题解
题目介绍
题解
法一:基于快速排序的选择方法
以中间元素pivot为基准进行排序后,右指针 r 的位置就是最终全部排序好后pivot的位置,然后去左边或右边递归寻找第k个位置(答案)的元素。
代码如下:
class Solution {public int findKthLargest(int[] nums, int k) {int n = nums.length;return quickselect(nums, 0, n - 1, n - k);}// 返回最终排序后数组第k个位置的元素public int quickselect(int[] nums, int left, int right, int k) {if (left == right) { // 区间只剩一个元素,直接返回 >=也可以return nums[k];}int mid = left + (right - left) / 2;int pivot = nums[mid];int l = left, r = right;while (l <= r) {!!!不能用<=,是为了防止中轴值(pivot)被多次交换while (nums[l] < pivot)l++; while (nums[r] > pivot)r--; if (l <= r) {swap(nums, l, r); l++;r--;}}// 递归处理左半部分或右半部分if (k <= r) {return quickselect(nums, left, r, k); // 目标在左半部分} else {return quickselect(nums, l, right, k); // 目标在右半部分}}public void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}