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