692. 前K个高频单词

692. 前K个高频单词

class Solution {
public:
    struct ComCoV
    {
        bool operator()(map<string,int>::iterator &l,map<string,int>::iterator &r)
        {
             if(l->second < r->second)   //这里是个坑,堆 < 是大堆
             return true;
             else if(l->second ==  r->second && l->first > r->first) //这里又是坑,比较pair第二个不用> 正常比较
             return true;
             else
             return false;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        vector<string> v;
        map<string,int>mp;
        for(const auto & e: words)
        {
            ++mp[e];
        }
        priority_queue<map<string,int>::iterator,vector<map<string,int>::iterator>,ComCoV> q;
//这里又是坑,优先级队列第二个参数的容器,其他容器都是比较器(仿函数)
        auto it = mp.begin();
        while(it != mp.end())
        {
            q.push(it);
            ++it;
        }
        while(k--)
        {
            v.push_back(q.top()->first);
            q.pop();
        }
        return v;
    }
};

 可以参考我自己写的priority_queue

#pragma once
#include<iostream>
#include"vector.h"
#include<algorithm>
#include<vector>
#include"data.h"

namespace bit
{
	template <class T>
	struct Less  //防函数
	{
		bool operator()(const T &a, const T &b)const 
		{
			return a < b;
		}
	};
	template<>
	struct Less<Data*>  //模板特化
	{
		bool operator()(const Data* a, const  Data* b)const
		{
			return *a < *b;
		}
	};
	template <class T>
	struct Greater
	{
		bool operator()(const T& a, const T& b)const
		{
			return a > b;
		}
	};
	template<>
	struct Greater<Data*>
	{
		bool operator()(const Data* a, const  Data* b)const
		{
			return *a > *b;
		}
	};
	template <class T, class Container = vector<T>, class Compare = Less<T>> //默认Less是大堆
	class priorirty_queue
	{
	private:
		void AdJustUp(int child)
		{
			Compare com;
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[parent] < _con[child])
			   if(com(_con[parent],_con[child]))
				{
					std::swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
		void AdjustDown(int parent)
		{
			Compare com;
			int child = 2 * parent + 1;
			while (child < _con.size())
			{
				//if (child + 1 < _con.size() && _con[child] > _con[parent])
				if(child + 1 < _con.size() && com(_con[child], _con[child + 1]))
				{
					++child;
				}
				if (com(_con[parent],_con[child]))
			  //if(com(_con[child], _con[child + 1]))
				{
					std::swap(_con[child], _con[parent]);
					parent = child;
					child = 2 * parent + 1;
				}
				else
				{
					break;
				}
			}
		}
	public:
		priorirty_queue() :_con(){};
		template <class iterator>
		priorirty_queue(iterator frist, iterator last)
			:_con( frist, last)
		{
			for (int i = (_con.size() - 1 - 1) / 2; i >= 0; --i)
			{
				AdjustDown(i);
			}
		}
		void push(const T & val)
		{
			_con.push_back(val);
			AdJustUp(_con.size() -1);
		}
		void pop()
		{
			if (empty()) return;
			std::swap(_con.front(), _con.back());
			_con.pop_back();
			AdjustDown(0);
		}
		 T& top()
		{
			return _con.front();
		}
		bool empty() const 
		{
			return _con.empty();
		}
		size_t size() const 
		{
			_con.size();
		}
	private:
		Container _con;
	};


	void priority_queue_test()
	{
		//priorirty_queue<int> pq;
		//pq.push(1);
		//pq.push(2);
		//pq.push(9);
		//pq.push(3);
		//pq.push(5);
		priorirty_queue<Data*> pq;
		pq.push(new Data(2021, 4, 19));
		pq.push(new Data(2020, 4, 19));
		pq.push(new Data(2022, 4, 19));
		while (!pq.empty())
		{
			std::cout << *pq.top();
			pq.pop();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值