Question:
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4]
and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
Here is a easy solution, but it seems we are not expected to do so?
public class Solution {
public int findKthLargest(int[] nums, int k) {
int n=nums.length;
int kplus=n-k+1; //the kth smallest
Arrays.sort(nums);
return nums[kplus-1];
}
}
We use quick sort
/*public class Solution {
public int findKthLargest(int[] nums, int k) {
int n=nums.length;
int kplus=n-k+1; //the kth smallest
Arrays.sort(nums);
return nums[kplus-1];
int n=nums.length;
int kplus=n-k+1;
}
}*/
public class Solution {
public int findKthLargest(int[] a, int k) {
int n = a.length;
int p = quickSelect(a, 0, n - 1, n - k + 1);
return a[p];
}
// return the index of the kth smallest number
int quickSelect(int[] a, int lo, int hi, int k) {
// use quick sort's idea
// put nums that are <= pivot to the left
// put nums that are > pivot to the right
int i = lo, j = hi, pivot = a[hi];
while(i<j)
{
if(a[i]>pivot)
{
j--;
swap(a,i,j);
}
else
{
i++;
}
}
swap(a,i,hi);
// count the nums that are <= pivot from lo
int m=i-lo+1;
if(m==k) return i;
//continue search the right part
else if(m<k) return quickSelect(a,i+1,hi,k-m);
else return quickSelect(a,lo,i-1,k);
}
void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}