前K个高频单词--力扣

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前K个高频单词--力扣相关的知识,希望对你有一定的参考价值。


前言

此题是 347.前K个高频元素的类似题目,多加了一个“如果不同的单词有相同出现频率,按字母顺序排序”

给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。
如果不同的单词有相同出现频率,按字母顺序排序。


一、示例

示例 1:

输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。

示例 2:

输入: [“the”, “day”, “is”, “sunny”, “the”, “the”, “the”, “sunny”, “is”, “is”], k = 4
输出: [“the”, “is”, “sunny”, “day”]
解析: “the”, “is”, “sunny” 和 “day” 是出现次数最多的四个单词,
出现次数依次为 4, 3, 2 和 1 次。

二、代码解析

1.哈希表排序

代码如下(示例):

/*
* 如何给unordered_map 按照value进行排序
* 需要重写sort中的排序
* unordered_map不能直接排序,需要使用pair存在vector中
*/
static bool comp(pair<string, int>& m, pair<string, int>& n)
{
    if (m.second==n.second)//如果出现的频率相等,按字母大小排序
    {
        return m.first < n.first;
    }
    else
    {
        return m.second > n.second;
    }
}

vector<string> topKFrequent(vector<string>& words, int k)
{
    vector<string> newWords(k, "");
    unordered_map<string, int> map;
    for (auto& word : words) 
    {
        ++map[word];
    }
    vector<pair<string, int> > b;
    for (auto x : map)
    {
        b.push_back(x);
    }

    sort(b.begin(), b.end(), comp);

    int index = 0;
    for (auto i : b)
    {
        newWords[index] = i.first;
        index++;
        if (index == k)
        {
            break;
        }
    }
    return newWords;
}

结果

在这里插入图片描述

2.优先队列

代码如下(示例):

vector<string> topKFrequent(vector<string>& words, int k)
{
	unordered_map<string, int> map;
	for (auto& word : words)
	{
		++map[word];
	}
	auto cmp = [](const pair<string, int>& a, const pair<string, int>& b)
	{
		return a.second == b.second ? a.first < b.first : a.second > b.second;//如果出现的频率相等,按字母大小排序
	};
	priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> que(cmp);
	for (auto& it : map)//剩余前K个高频单词
	{
		que.emplace(it);
		if (que.size() > k)
		{
			que.pop();
		}
	}
	vector<string> ret(k);
	for (int i = k - 1; i >= 0; i--)
	{
		ret[i] = que.top().first;
		que.pop();
	}
	return ret;
}

结果

在这里插入图片描述

3.测试

代码如下(示例):

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

/*
* 如何给unordered_map 按照value进行排序
* 需要重写sort中的排序
* unordered_map不能直接排序,需要使用pair存在vector中
*/
/*
static bool comp(pair<string, int>& m, pair<string, int>& n)
{
	if (m.second == n.second)//如果出现的频率相等,按字母大小排序
	{
		return m.first < n.first;
	}
	else
	{
		return m.second > n.second;
	}
}

vector<string> topKFrequent(vector<string>& words, int k)
{
	vector<string> newWords(k, "");
	unordered_map<string, int> map;
	for (auto& word : words)
	{
		++map[word];
	}
	vector<pair<string, int> > b;
	for (auto x : map)
	{
		b.push_back(x);
	}

	sort(b.begin(), b.end(), comp);

	int index = 0;
	for (auto i : b)
	{
		newWords[index] = i.first;
		index++;
		if (index == k)
		{
			break;
		}
	}
	return newWords;
}*/

vector<string> topKFrequent(vector<string>& words, int k)
{
	unordered_map<string, int> map;
	for (auto& word : words)
	{
		++map[word];
	}
	auto cmp = [](const pair<string, int>& a, const pair<string, int>& b)
	{
		return a.second == b.second ? a.first < b.first : a.second > b.second;//如果出现的频率相等,按字母大小排序
	};
	priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> que(cmp);
	for (auto& it : map)//剩余前K个高频单词
	{
		que.emplace(it);
		if (que.size() > k)
		{
			que.pop();
		}
	}
	vector<string> ret(k);
	for (int i = k - 1; i >= 0; i--)
	{
		ret[i] = que.top().first;
		que.pop();
	}
	return ret;
}


int main()
{
	vector<string> words = { "the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is" };
	vector<string> k = topKFrequent(words, 4);
	for (int i = 0; i < k.size(); i++)
	{
		cout << k[i] << " ";
	}
	return 0;
}

结果

在这里插入图片描述


总结

在这里插入图片描述

以上是关于前K个高频单词--力扣的主要内容,如果未能解决你的问题,请参考以下文章

前 K 个高频元素--力扣

OJ | 力扣347输出前 K 个高频元素

力扣347——前 K 个高频元素

leetcode-692-前K个高频单词

力扣刷题:前 K 个高频元素(java实现)

力扣刷题:前 K 个高频元素(java实现)