Leetcode215. 数组中的第K个最大元素(快排)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode215. 数组中的第K个最大元素(快排)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/

解题思路

回想一下快速排序的过程
①确定分界点x,在区间[ l , r ]随意取一个数
②根据分界点x调整,使得x左边的数都小于等于x,x右边的数都大于等于x (难点)
③递归处理左边和右边
在②中我们使得x左边都大于等于x,x右边都小于等于x,这样不就确认了x的是在数组中排第几个位置吗?这时就可以统计x左边的个数,如果大于等于k就代表第k个数在x的左边,所以这时递归左边区间就行;否则递归右边区间;直到l >= r时,也代表找到了第k个数,直接返回就是答案。

代码

class Solution {
    public int findKthLargest(int[] nums, int k) {
        return quicklySort(nums, 0, nums.length - 1, k);
    }
    int quicklySort(int[] nums, int l, int r, int k) {
        if(l >= r) return nums[l];  //代表找到了第k个数,直接返回就是答案。
        int x = nums[l];    //确定分界点
        int i = l - 1, j = r + 1;   //方便后面统一处理
        while(i < j) {      //使得x左边都大于等于x,右边都小于等于x
            while(nums[++i] > x);
            while(nums[--j] < x);
            if(i < j) {
                int t = nums[i];
                nums[i] = nums[j];
                nums[j] = t;
            }
        }
        int s = j - l + 1;  //计算左区间的个数
        if(s >= k)      //如果左区间个数比k大,代表第k个数在左区间
            return quicklySort(nums, l, j, k);
        else
            return quicklySort(nums, j + 1, r, k - s);
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(logn)

以上是关于Leetcode215. 数组中的第K个最大元素(快排)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 215. 数组中的第K个最大元素 | Python

LeetCode215. 数组中的第K个最大元素

leetcode笔记215. 数组中的第K个最大元素

[LeetCode]215. 数组中的第K个最大元素(堆)

leetcode 215. 数组中的第K个最大元素(快速排序)

Leetcode 215. 数组中的第K个最大元素