在不增加空间复杂度的情况下,用堆排序。维护一个大小为k的堆。如果是找最大的K个值,那么用大顶堆,否则用小顶堆。
先从原数组中取k个值建立一个堆,然后每次从原数组中拿一个值与堆顶元素进行比较,看是否需要替换,如果替换了,就进行一次堆排序。这样到最后,这个堆中的元素就是top K。
前K大,维护最小堆;前K小,维护最大堆
1.初始化一个最小堆
2.输入新数据,若大于堆顶则替换堆顶,调整堆为最小堆(从最后一个父节点开始调整)
3.遍历完数据,遍历完数据,堆中数据即为所求
复杂度O(n*logK)
可以参考下面的代码。
class Solution {
public int findKthLargest(int[] nums, int k) {
int[] topK = new int[k];
for(int i=0; itopK[0]){
topK[0] = nums[j];
sort(topK, 0, k);
}
}
return topK[0];
}
public void sort(int[] nums, int index, int size){
int i = index;
int j = 2*index+1;
while(jnums[j+1])
j++;
if(nums[i]=0; i--){
sort(nums, i, nums.length);
}
// for(int i=1; i
还有递归版的:
class Solution {
public List topKFrequent(int[] nums, int k) {
List res=new ArrayList<>();
// 先用hashmap统计词频
HashMap map=new HashMap<>();
for(int i=0;i=0;i--){
adjust(nums,length,i);
}
}
// 查找topK
public int[] topK(int[] nums,int k){
int top[]=new int[k];
for(int i=0;itop[0]){
top[0]=nums[j];
adjust(top,k,0);
}
}
return top;
}
}
参考:
https://blog.csdn.net/Z_Y_D_/article/details/84646443