力扣 215.数组中的第K个最大元素 ----快速选择做法

文章目录

  • 题目介绍
  • 题解

题目介绍

力扣 215.数组中的第K个最大元素 ----快速选择做法_第1张图片

题解

基于快速排序的选择方法

以中间元素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;
    }
}

你可能感兴趣的:(leetcode,算法,排序算法)