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.
归并算法,这是CLRS上有详细讲解。
- 使用CLRS的分割方法
class Solution {
public:
int get_rand(int a, int b) {
if (b <= a) return 0;
srand((unsigned)time(NULL));
return rand() % (b-a+1) + a;
}
#define SWAP(v, i, j) \
tmp = v[j]; \
v[j] = v[i]; \
v[i] = tmp;
int partition(vector<int>& nums, int p, int q, int r) {
int tmp;
int i, j;
if (p == q) return p;
SWAP(nums, r, q);
i = p-1;
for (j = p; j < q; ++j) {
if (nums[j] > nums[q]) {
++i;
SWAP(nums, i, j);
}
}
SWAP(nums, i+1, q);
return i+1;
}
int _findKthLargest(vector<int>& nums, int p, int q, int k) {
int r = get_rand(p, q);
r = partition(nums, p, q, r);
if ((r-p+1) == k) {
return nums[r];
} else if ((r-p+1) > k) {
return _findKthLargest(nums, p, r-1, k);
} else {
return _findKthLargest(nums, r+1, q, k-r+p-1);
}
}
int findKthLargest(vector<int>& nums, int k) {
return _findKthLargest(nums, 0, nums.size()-1, k);
}
};
2 另外一种分割方法
class Solution {
public:
int get_rand(int a, int b) {
if (b <= a) return 0;
srand((unsigned)time(NULL));
return rand() % (b-a+1) + a;
}
#define SWAP(v, i, j) \
tmp = v[j]; \
v[j] = v[i]; \
v[i] = tmp;
int partition(vector<int>& nums, int p, int q, int r) {
int tmp;
int i, j;
if (p == q) return p;
SWAP(nums, r, q);
i = p;
j = q-1;
while (i != j) {
if (nums[i] >= nums[q]) {
++i;
} else {
SWAP(nums, i, j);
--j;
}
}
if (nums[i] < nums[q]) {
SWAP(nums, i, q);
} else {
++i;
SWAP(nums, i, q);
}
return i;
}
int _findKthLargest(vector<int>& nums, int p, int q, int k) {
int r = get_rand(p, q);
r = partition(nums, p, q, r);
if ((r-p+1) == k) {
return nums[r];
} else if ((r-p+1) > k) {
return _findKthLargest(nums, p, r-1, k);
} else {
return _findKthLargest(nums, r+1, q, k-r+p-1);
}
}
int findKthLargest(vector<int>& nums, int k) {
return _findKthLargest(nums, 0, nums.size()-1, k);
}
};