解题思路:
快速选择,目标是找出数组中第 k 小(或第 k 大)的元素,而不是对整个数组进行排序。
(需要和快排进行区分,快排的目的是排序)
注意:
i = l - 1, j = r + 1; 为什么要这么写?而不是 i = l; j = r ?
因为是先执行do语句的内容,一开始进循环就已经先i++或者j--了,所以进循环前需要-1和+1。
class Solution {public int findKthLargest(int[] nums, int k) {int n = nums.length;return quickselect(nums, 0, n - 1, n - k);}public int quickselect(int[] nums, int l, int r, int k) {if (l == r) return nums[k];int i = l - 1, j = r + 1;while (i < j) {do i++; while (nums[i] < nums[l]);do j--; while (nums[j] > nums[l]);if (i < j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}if (k <= j) return quickselect(nums, l, j, k);else return quickselect(nums, j + 1, r, k);}
}