LeetCode第215题“数组中的第K个最大元素”要求找到未排序数组中第k
个最大的元素。通常有几种常见的解决方案,包括使用排序、使用最小堆或快速选择算法。以下是这三种方法的详细C++实现:
方法一:使用排序
这种方法最为直观,先对数组进行排序,然后返回第k
个最大的元素。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), greater<int>());
return nums[k - 1];
}
};
int main() {
Solution solution;
vector<int> nums = {3, 2, 1, 5, 6, 4};
int k = 2;
cout << "The " << k << "th largest element is " << solution.findKthLargest(nums, k) << endl;
return 0;
}
方法二:使用最小堆
这种方法利用优先队列(最小堆),可以在O(NlogK)时间内找到第k
个最大的元素。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int, vector<int>, greater<int>> minHeap;
for (int num : nums) {
minHeap.push(num);
if (minHeap.size() > k) {
minHeap.pop();
}
}
return minHeap.top();
}
};
int main() {
Solution solution;
vector<int> nums = {3, 2, 1, 5, 6, 4};
int k = 2;
cout << "The " << k << "th largest element is " << solution.findKthLargest(nums, k) << endl;
return 0;
}
方法三:快速选择算法
快速选择是一种高效的选择算法,平均时间复杂度为O(N),最坏情况下为O(N^2)。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return quickSelect(nums, 0, nums.size() - 1, nums.size() - k);
}
private:
int quickSelect(vector<int>& nums, int left, int right, int k) {
if (left == right) return nums[left];
int pivotIndex = partition(nums, left, right);
if (k == pivotIndex) {
return nums[k];
} else if (k < pivotIndex) {
return quickSelect(nums, left, pivotIndex - 1, k);
} else {
return quickSelect(nums, pivotIndex + 1, right, k);
}
}
int partition(vector<int>& nums, int left, int right) {
int pivot = nums[right];
int storeIndex = left;
for (int i = left; i < right; i++) {
if (nums[i] < pivot) {
swap(nums[storeIndex], nums[i]);
storeIndex++;
}
}
swap(nums[storeIndex], nums[right]);
return storeIndex;
}
};
int main() {
Solution solution;
vector<int> nums = {3, 2, 1, 5, 6, 4};
int k = 2;
cout << "The " << k << "th largest element is " << solution.findKthLargest(nums, k) << endl;
return 0;
}
选择合适的方法
- 如果数组较小且k值较大,排序方法(方法一)简单直接。
- 如果数组较大且需要高效处理,最小堆方法(方法二)和快速选择算法(方法三)更为适合。特别是快速选择算法在平均情况下时间复杂度较低,是处理大规模数据的较好选择。