求 n 个整数中第 k(1≤k≤n) 大的整数。 输入格式 n 和 k n 个整数 c++
时间: 2024-10-25 15:05:54 浏览: 24
在C++中,你可以使用优先队列(`std::priority_queue`)来解决这个问题。优先队列默认按照元素值进行最大堆排序,这样就可以轻松地找到第k大的元素。这里是一个简单的算法步骤:
1. 创建一个空的最大优先队列(`std::priority_queue<int, std::vector<int>, std::greater<int>> pq;`)。`std::greater<int>` 定义了比较规则,使得队列始终存储最大的元素。
2. 遍历输入的n个整数,将每个数字插入到优先队列中。
3. 如果遍历次数小于k,说明还没有收集到足够的元素,继续直到收集到k个。
4. 第k个元素已经在队列顶部,由于队列始终保持最大,所以直接返回 `pq.top()` 即可。
以下是完整的示例代码:
```cpp
#include <iostream>
#include <queue>
int findKthLargest(int nums[], int k, int n) {
std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
for (int i = 0; i < n && i < k; ++i) {
pq.push(nums[i]);
}
// 如果k大于已经收集到的数量,再从原数组中取
if (k > n) {
for (int i = n; i >= 0 && k > 1; --i) {
if (nums[i] > pq.top()) {
pq.pop();
pq.push(nums[i]);
--k;
}
}
}
return pq.top(); // 返回第k大的元素
}
int main() {
int n, k;
std::cin >> n >> k;
int* nums = new int[n];
for (int i = 0; i < n; ++i) {
std::cin >> nums[i];
}
int result = findKthLargest(nums, k, n);
std::cout << "The " << k << "th largest number is: " << result << "\n";
delete[] nums;
return 0;
}
```
阅读全文