在数组中找到第k大的元素。
样例
给出数组 [9,3,2,4,8],第三大的元素是 4
给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推
挑战
要求时间复杂度为O(n),空间复杂度为O(1)
Find K-th largest element in an array.
Example
In array [9,3,2,4,8], the 3rd largest element is 4.
In array [1,2,3,4,5], the 1st largest element is 5, 2nd largest element is 4, 3rd largest element is 3 and etc.
Challenge
O(n) time, O(1) extra memory.
时间复杂度O(nlogn)?
class Solution {
/*
* @param k : description of k
* @param nums : array of nums
* @return: description of return
*/
public int kthLargestElement(int k, int[] nums) {
if(null == nums ||k <= 0 || nums.length < k) return Integer.MIN_VALUE;
kthMax(nums, 0, nums.length-1, k);
return nums[k-1];
}
public void kthMax(int[] nums, int left, int right, int k) {
int mid = partition(nums, left, right);
if(mid == k-1) return;
if(mid > k-1)
kthMax(nums, left, mid-1, k);
else
kthMax(nums, mid+1, right, k);
}
public int partition(int[] nums, int left, int right) {
int temp = nums[left];
while(left < right) {
while(left < right && nums[right] <= temp)
right--;
nums[left] = nums[right];
while(left < right && nums[left] > temp)
left++;
nums[right] = nums[left];
}
nums[left] = temp;
return left;
}
};