Top-K 问题

代码:#include

include

include

include

using namespace std;

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

// 最小堆(优先队列)维护当前最大的M个元素
priority_queue<long long, vector<long long>, greater<long long>> 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<long long> 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霖  阅读(5)  评论(0)    收藏  举报