1.最简单的思路是把输入的n个整数排序,排序后位于最前面的k个数就是最小的k个数,这种思路的时间复杂度为O(nlgn)
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return(nums[k]);
}
2.基于快速Partion函数解决,不需对所有的整数排序,只需找到数组的第k个数,满足比第k个数小的数均位于数组的左边,比第k个数大的数均位于数组的右边。这种算法的时间复杂度为O(nlgk)(不太清楚怎么算,也有说对数组进行随机顺序处理,可使时间复杂度为O(n))
public int findKthLargest(int[] nums, int k) {
int lo=0,hi=nums.length-1;
while(lo<=hi){
int j=partion(nums, lo, hi);
if(j==k)
break;
else if(j>k)
hi=j-1;
else
lo=j+1;
}
return nums[k];
}
public int partion(int[] num,int start,int end){
int i=start,j=end+1;
int v=num[start];
while(true){
while(i<end && num[++i]<v) ;
while(j>start && num[--j]>v) ;
if(i>=j) break;
exch(num, i, j);
}
exch(num, start, j);
return j;
}
public void exch(int[] num,int i,int j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
3.下面这种算法可针对于海量数据,无需把所有的数全部一次性放到内存中,针对每次输入,用一个k大的存储空间维护最小的k个数。时间复杂度为O(nlgk),空间复杂度为O(k)