描述
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;
}
}
};