中国建设网站上报名塔吊司索工现在百度怎么优化排名
思路源于
7-2「力扣」第 215 题:数组中的第 K个最大元素
基于快速排序思路的一种求解,我们的问题是求解第k个最大的元素,那么也就是排序后数组下标索引在n-k的位置
快速排序中我们随机选择一个轴值,左边的元素都小于他,右边的元素都大于他,然后返回这个下标索引(分割点),如果这个分割点恰好是n-k那么这就是最终结果,如果分割点比n-k小那么说明答案应该在右边的区间,反之答案就在左边的区间
如果都没找到说明k肯定不合法直接返回-1
class Solution {private Random random = new Random();private int partition(int[] nums, int left, int right) {// 随机选择基准元素的索引int randomIndex = left + random.nextInt(right - left + 1);// 将随机选择的基准元素放到 left 位置swap(nums, randomIndex, left);while (left < right) {while (left < right && nums[left] <= nums[right]) {right--;}if (left < right) {swap(nums, left, right);left++;}while (left < right && nums[left] <= nums[right]) {left++;}if (left < right) {swap(nums, left, right);right--;}}return left;}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public int findKthLargest(int[] nums, int k) {int target = nums.length - k;int left = 0, right = nums.length - 1;while (left <= right) {int pivotPos = this.partition(nums, left, right);if (pivotPos == target) {return nums[pivotPos];} else if (pivotPos < target) {left = pivotPos + 1;} else {right = pivotPos - 1;}}return -1;}
}