1. 优先队列方法
缺点:在k值比较大的时候,会有较高的空间消耗。
class Solution {
public:
struct cmp {
bool operator()(int& a, int& b) {
return a > b;
}
};
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int, vector<int>, cmp> pq_;
for (int i = 0; i < nums.size(); i++) {
if (pq_.size() >= k) {
if (nums[i] > pq_.top()) {
pq_.pop();
pq_.push(nums[i]);
}
continue;
}
pq_.push(nums[i]);
}
return pq_.top();
}
};
2. 采用快排思想解法
注:平均时间复杂读O(N)
int quickSort(vector<int>& nums, int lo, int hi, int k)
{
int i = lo, j = hi;
int tmpV_ = nums[lo];
while (i < j) {
while (nums[j] >= tmpV_ && i < j)
j--;
if (i < j) {
nums[i] = nums[j];
i++;
}
while (nums[i] < tmpV_ && i < j)
i++;
if (i < j) {
nums[j] = nums[i];
j--;
}
}
nums[i] = tmpV_;
/* 判断递归方向 */
if (nums.size() - i == k)
return nums[i];
if (nums.size() - i > k)
return quickSort(nums, i + 1, hi, k);
if (nums.size() - i < k)
return quickSort(nums, lo, i - 1, k);
}
int findKthLargest(vector<int>& nums, int k)
{
return quickSort(nums, 0, nums.size() - 1, k);
}
本文介绍了两种高效求解数组中第K大元素的方法:优先队列法和快速排序法。优先队列法通过维护一个大小为K的最小堆解决,而快速排序法则利用了分治的思想,平均时间复杂度为O(N)。
1247

被折叠的 条评论
为什么被折叠?



