思路
可以用排序,但是不用全有序
还有个要求是O(n)
快排改版
快排只排需要的部分
public int findKthLargest(int[] nums, int k) {
return quickSort(nums, 0, nums.length-1, nums.length-k);
}
public static int quickSort(int[] nums, int low, int high, int k){
if (low<high){
int pivot = partition(nums, low, high);
if (pivot == k){
return nums[pivot];
}else if (pivot > k){
return quickSort(nums, low, pivot-1, k);
}else {
return quickSort(nums, pivot+1, high, k);
}
}
}
public static int partition(int[] nums, int low, int high){
int pivot = nums[high];
while (low<high){
while (low<high && nums[low] <= pivot){
low++;
}
nums[high] = nums[low];
while (low<high && nums[high] >= pivot){
high--;
}
nums[low] = nums[high];
}
nums[low] = pivot;
return low;
}
桶排序
因为给的数据不大,桶排序大概只需要两次循环就可以
class Solution {
public int findKthLargest(int[] nums, int k) {
int[] buckets = new int[20001];
for (int i = 0; i < nums.length; i++) {
buckets[nums[i]+10000]++;
}
for (int i = 20000; i >=0; i--) {
k = k -buckets[i];
if (k<=0){
return i-10000;
}
}
return 0;
}
}