题解 | #输入n个整数,输出其中最小的k个#

输入n个整数,输出其中最小的k个

https://www.nowcoder.com/practice/69ef2267aafd4d52b250a272fd27052c

#include <bits/stdc++.h>
#include <functional>
using namespace std;
void heapify(vector<int> &heap, int i, int heapSize){
    int last = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    if(l < heapSize && heap[l] < heap[last]){
        last = l;
    }
    if(r < heapSize && heap[r] < heap[last]){
        last = r;
    }
    if(i != last){
        swap(heap[i], heap[last]);
        heapify(heap, last, heapSize);
    }
}

void buildHeap(vector<int>& heap, int heapSize){
    for(int i = heapSize / 2 - 1; i >= 0; --i){
        heapify(heap, i, heapSize);
    }
    // for(int i = heapSize - 1; i >= 0; --i){
    //     swap(heap[0], heap[i]);
    //     heapify(heap, 0, i);
    // }
}
int main() {
    int n, k;
    cin >> n >> k;
    int x;
    // auto cmp = ([](const int a, const int b) {
    //     return a > b;
    // });
    // priority_queue<int, vector<int>, decltype(cmp)> q(cmp);
    // while (cin >> x) {
    //     q.push(x);
    // }
    //vector<int> res;
    // while(k--){
    //     res.push_back(q.top());
    //     q.pop();
    // }
    // for(auto &i : res){
    //     cout << i << " ";
    // }
    vector<int> heap;
    while(cin >> x){
        heap.push_back(x);
    }
    buildHeap(heap, n);
    int heapSize = n;
    for(int i = 0; i < k; ++i){
        cout << heap[0] << " ";
        swap(heap[0], heap[heapSize - 1]);
        heapSize--;
        heapify(heap, 0, heapSize);
    }

    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务