为什么我把pq也存成(元素,频次)就不对,make_pair和res.push_back里都做了相应调整

来源:6-7 优先队列相关的算法问题 Top K Frequent Elements

幕布斯0154384

2018-08-07

class Solution {

public:

    vector<int> topKFrequent(vector<int>& nums, int k) {

        

        assert(k>0);

        

        unordered_map<int,int> record;

        for(int i=0; i<nums.size(); i++)

            record[nums[i]]++;

        assert(k <= record.size());

        

        priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;

        for(unordered_map<int,int>::iterator iter=record.begin(); iter != record.end(); iter++){

            if(pq.size() == k){

                if(iter->second > pq.top().second){

                    pq.pop();

                    pq.push(make_pair(iter->first, iter->second));

                }

            }

            else

                 pq.push(make_pair(iter->first, iter->second));

        }

        

        vector<int> res;

        while(!pq.empty()){

            res.push_back(pq.top().first);

            pq.pop();

        }

        return res;

    }

};

写回答

1回答

liuyubobobo

2018-08-07

首先,课程所讲解的算法,是按照(频次,元素)的顺序进行存储的。这一小节的课程官方代码,请参考:https://github.com/liuyubobobo/Play-with-Algorithm-Interview/blob/master/06-Stack-and-Queue/Course%20Code%20(C%2B%2B)/07-Top-K-Frequent-Elements/main.cpp


为什么使用(元素,频次)存储是不对的?因为C++中,两个pair类型比较,默认是先比较第一个元素,再比较第二个元素的。所以如果使用(频次,元素)存储,将先比较频次,从而达到每次从堆中取出频次最大的元素的目的。但是如果按照(元素,频次)存储,每次从对中取出的是元素的值最大的这个数据对,根本没有根据元素的频次取出数据,结果肯定是不对的:)


如果愿意,可以debug但不跟踪试试看。对于一个小的测试用例,看看按照(频次,元素)存储和按照(元素,频次)存储,每次从优先队列取出的数据有什么不同?:)


加油!

1
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程