题目描述:
Find K-th largest element in an array.
Notice
You can swap elements in the 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.
这题要达到题目要求,只能用quick sort的思想:不断找pivot,如果它在第k个位置,就返回nums[k - 1];不然就根据pivot的位置进行recursive查找。
Mycode(AC = 82ms):
class Solution {
public:
/*
* param k : description of k
* param nums : description of array and index 0 ~ n-1
* return: description of return
*/
int kthLargestElement(int k, vector<int> nums) {
// write your code here
if (nums.size() == 0) return 0;
kthLargestElement(k, nums, 0, nums.size() - 1);
return nums[k - 1];
}
void kthLargestElement(int& k,
vector<int>& nums,
int start,
int end)
{
if (start >= end) return;
int pivot = findPivot(nums, start, end);
if (pivot > k) {
kthLargestElement(k, nums, start, pivot - 1);
}
else if (pivot < k) {
kthLargestElement(k, nums, pivot + 1, end);
}
else {
return;
}
}
int findPivot(vector<int>& nums, int start, int end) {
if (start == end) return start;
int pivot = nums[end];
int l = start, r = end;
while (l < r) {
while (l < r && nums[l] >= pivot) {
l++;
}
nums[r] = nums[l];
while (l < r && nums[r] <= pivot) {
r--;
}
nums[l] = nums[r];
}
nums[l] = pivot;
return l;
}
};