这道题目看了很多方法,都是比较各种排序然后得到想要的。下面有一直线性简单的方法,对于处理小型问题比较有效,因为是时间复杂度线性的O(n),但是空间复杂度比较可怕,特别是如果min和max差别很大的时候,且中间空了很多位。
public int findKthLargest(int[] nums, int k) {
if(nums.length == 0 || k < 1) return -1;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int n: nums) {
max = Integer.max(max, n);
min = Integer.min(min, n);
}
int[] freq = new int[max-min+1];
for(int n : nums) ++freq[max-n]; // 0 is max
for(int i = 0; i < freq.length; ++i){
k -= freq[i];
if(k <= 0) return max - i;
}
return -1;
}