描述
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.
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
难度:medium
思路
这次所选择的是一道可以采用分治算法的题目,实际上是采用了课上老师所讲的算法。
在数组中随机选一个数称为flag,然后将原数组分为三个部分,大于flag部分,小于flag部分,等于flag部分。然后通过这三个数组的大小,推断第k大的数属于哪个数组,进行递归调用。具体的如图:
整体来说算法还是比较简单,但是这个算法的时间复杂度呢?
从最坏情况考虑,是比较糟糕的,大概是O(n^2),不过实际做起来,这种情况发生的概率很低。
答案
#include <time.h>
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
// get random number
srand(time(NULL));
int index = rand() % nums.size();
int flag = nums[index];
vector<int> smaller, equal, bigger;
// group into three number
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] < flag) {
smaller.push_back(nums[i]);
} else if (nums[i] == flag) {
equal.push_back(nums[i]);
} else {
bigger.push_back(nums[i]);
}
}
if (bigger.size() >= k) {
return findKthLargest(bigger, k);
} else if (bigger.size() + equal.size() < k) {
return findKthLargest(smaller, k - bigger.size() - equal.size());
} else {
return flag;
}
}
};