模板题目 & 链接
Leetcode 215 Kth Largest Element 第K大的元素
Leetcode 347. Top K Frequent Elements TopK高频元素
基本思路:
快速选择是快速排序算法的衍生品,当对数组进行partition分组时,实际上就是将比pivot大或者小的分成一组,加入pivot数组在整个数组中是第K大的元素,那么partition后pivot之前就是前K-1大的元素集合,只是顺序不确定。根据这个快速排序partition的性质,可以引出快速选择的基本问询功能:- 注意:快速选择得到前K个不保证是有序的
对于一个无序的数组:
- 求第K大、小的元素
- 求前K大、小的元素集合
- 求满足某种条件的前K个或者第K个
思路就是快速排序类似,代码如下:
private void quickSelect(int[] nums, int start, int end, int k) {
if(start>end) return;
int l = start, r = end;
int mid = l + (r-l>>1);
int pivot = nums[mid];
while(l<=r) {
while(l<=r && nums[l]<pivot) l++;
while(l<=r && nums[r]>pivot) r--;
if(l<=r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
// k在前一半
if(k<=r) quickSelect(nums, start, r, k);
else quickSelect(nums, l, end, k);
}
时间复杂度:, 最坏情况:每一次partition都只分割出一个元素的顺序(一组N-1个,一组1个);空间复杂度:。