215.数组中的第 K 个最大元素 (Medium)*
题目描述*
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例*
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
代码*
可以用快排,快一点用堆排,维护一个 k 的元素的小顶堆,当个数大于 k 时,移除堆顶元素。还可以使用快速选择,只确定目标位置元素即可。
class Solution {
public:
// 日常复习快排
void quickSort(vector<int>& nums, int l, int r) {
int pos = 0;
if(l < r) {
int pivot = nums[l];
int i = l, j = r;
while(i < j) {
while(i < j && nums[j] >= pivot) {
j--;
}
if(i < j) {
nums[i] = nums[j];
i++;
}
while(i < j && nums[i] <= pivot) {
i++;
}
if(i < j) {
nums[j] = nums[i];
j--;
}
nums[i] = pivot;
}
quickSort(nums, l, i - 1);
quickSort(nums, i + 1, r);
}
}
int findKthLargest(vector<int>& nums, int k) {
quickSort(nums, 0, nums.size() - 1);
return nums[nums.size() - k];
}
};
class Solution {
public:
// 快排 8 太适合这个问题,用堆排
int heapSort(vector<int>& nums, int k) {
priority_queue<int, vector<int>, greater<int>> res;
for(int i = 0; i < nums.size(); i++) {
res.push(nums[i]);
if(res.size() > k) {
res.pop();
}
}
return res.top();
}
int findKthLargest(vector<int>& nums, int k) {
quickSort(nums, 0, nums.size() - 1);
return nums[nums.size() - k];
}
};
class Solution {
private:
int target;
int n;
public:
int findKthLargest(vector<int>& nums, int k) {
n = nums.size();
target = n - k;
quickSort(nums, 0, n - 1);
return nums[target];
}
void quickSort(vector<int>& nums, int l, int r) {
if(l > r) {
return;
}
swap(nums[l], nums[l + rand() % (r - l + 1)]);
int finalPos = l + 1;
for(int i = l + 1; i <= r; i++) {
if(nums[i] < nums[l]) {
swap(nums[i], nums[finalPos++]);
}
}
swap(nums[l], nums[--finalPos]);
if(finalPos == target) {
return;
}else if(finalPos > target) {
quickSort(nums, l, finalPos - 1);
}else {
quickSort(nums, finalPos + 1, r);
}
}
};
最后更新: July 23, 2022