Top-K 问题

代码:#include

include

include

include

using namespace std;

int main() {
int N, M;
cin >> N >> M;

// 最小堆(优先队列)维护当前最大的M个元素
priority_queue<long long, vector, greater> heap;

// 读取所有资产值
for (int i = 0; i < N; i++) {
long long asset;
cin >> asset;

if (heap.size() < M) {
heap.push(asset); // 堆未满时直接插入
} else if (asset > heap.top()) {
heap.pop(); // 移除堆顶(当前最小元素)
heap.push(asset); // 插入更大的元素
}
}

// 将堆中元素存入数组并逆序排序
vector result;
while (!heap.empty()) {
result.push_back(heap.top());
heap.pop();
}
reverse(result.begin(), result.end());

// 输出结果
for (int i = 0; i < result.size(); i++) {
if (i > 0) cout << " ";
cout << result[i];
}

return 0;
}
核心算法逻辑
cpp
运行
for (int i = 0; i < N; i++) {
long long asset;
cin >> asset;

if (heap.size() < M) {
heap.push(asset); // 堆未满时直接插入
} else if (asset > heap.top()) {
heap.pop(); // 移除堆顶(当前最小元素)
heap.push(asset); // 插入更大的元素
}
}

遍历所有 N 个元素:
如果堆的大小小于 M,直接将元素插入堆
如果堆已满且当前元素比堆顶大:
移除堆顶元素(当前最小元素)
将当前元素插入堆

posted @ 2025-06-24 16:42  YOLO霖  阅读(25)  评论(0)    收藏  举报