题解 | 【模板】哈夫曼编码

【模板】哈夫曼编码

https://www.nowcoder.com/practice/4c0419eb07c840ca8402e4f2a52cfd49

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<long long> freq(n);  // 使用 long long 防止大数溢出
    for (int i = 0; i < n; ++i) {
        cin >> freq[i];
    }

    // 使用优先队列(最小堆)
    priority_queue<long long, vector<long long>, greater<long long>> minHeap;
    for (long long num : freq) {
        minHeap.push(num);
    }

    long long totalLength = 0;

    // 合并直到只剩一个节点
    while (minHeap.size() > 1) {
        long long first = minHeap.top(); minHeap.pop();
        long long second = minHeap.top(); minHeap.pop();
        long long merged = first + second;
       
        totalLength += merged;  // 累加合并后的权重
        minHeap.push(merged);
    }

    cout << totalLength << endl;
    return 0;
}

c++中priority_queue容器提供了大小顶堆的数据结构,通过greater或者less<T>来指定大顶还是小顶,依次出栈2个元素构造哈夫曼节点,从而计算权重

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-17 09:40
点赞 评论 收藏
分享
用微笑面对困难:加急通知你不合适,也很吗有礼貌了你。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务