题目:
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.
课上的例题,用类似快排的方法将数组分成两个集合:小于等于x的集合和大于x的集合。这样就可以确定第k大的数字处于哪个集合了,而另一个集合就不需要再搜索(递归)了。
时间复杂度,期望O(n)。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return find(nums, 0, nums.size() - 1, nums.size() + 1 - k);
}
int find(vector<int>& v, int lt, int rt, int k) {
if (lt == rt) return v[lt];
random_shuffle(v.begin() + lt, v.begin() + rt);
if (v[rt] < v[rt - 1]) swap(v[rt], v[rt - 1]);
int a = lt, b = rt - 1;
bool p = 1;
while (a != b) {
if (v[a] <= v[b]) {
if (p == 1) a++;
else b--;
}
else {
swap(v[a], v[b]);
if (p == 1) b--, p = 0;
else a++, p = 1;
}
}
if (k <= a - lt + 1) return find(v, lt, a, k);
else return find(v, a + 1, rt, k - (a - lt + 1));
}
};
当然更直观的方法还是排序直接找第k大。
很尴尬,O(nlogn)的方法反而快一些。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
return nums[nums.size() - k];
}
};