前 K 个高频元素--力扣

Posted 穿迷彩服的鲨鱼

tags:

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


前言

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

一、示例

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:

输入: nums = [1], k = 1
输出: [1]

二、代码解析

1.暴力解法

代码如下(示例):

//给二位数组排序
//第一维按从大到小,如果第一维相等,按第二维从大到小排序
static bool cmp(const vector<int>& v1, const vector<int>& v2)
{
	if (v1[0] == v2[0])
	{
		return v1[1] > v2[1];
	}
	else
	{
		return v1[0] > v2[0];
	}
}

vector<int> topKFrequent(vector<int>& nums, int k)
{
	vector<int> topFrequent;
	vector<vector<int>> map;
	map.push_back({ 0,nums[0] });
	for (int i = 1; i < nums.size(); ++i)
	{
		int index = -1;
		for (int j = 0; j < map.size(); ++j)
		{
			if (nums[i] == map[j][1])
			{
				++map[j][0];
				index = 0;
				break;
			}
		}
		if (index == -1)
		{
			map.push_back({ 0,nums[i] });
		}
	}
	sort(map.begin(), map.end(), cmp);
	for (int i = 0; i < k; ++i)
	{
		topFrequent.push_back(map[i][1]);
	}
	return topFrequent;
}

结果

在这里插入图片描述

2.哈希表排序

代码如下(示例):

/*
* 如何给unordered_map 按照value进行排序
* 需要重写sort中的排序
* unordered_map不能直接排序,需要使用pair存在vector中
*/
static bool comp(pair<int, int>& m, pair<int, int>& n)
{
	return m.second > n.second;
}

//哈希表排序
vector<int> topKFrequent(vector<int>& nums, int k)
{
	vector<int> newNums(k, 0);
	unordered_map<int, int> map;
	for (auto& num : nums)
	{
		++map[num];
	}

	vector<pair<int, int> > b;
	for (auto x : map)
	{
		b.push_back(x);
	}

	sort(b.begin(), b.end(), comp);
	int index = 0;
	for (auto i : b)
	{
		newNums[index] = i.first;
		index++;
		if (index == k)
		{
			break;
		}
	}
	return newNums;
}

结果

在这里插入图片描述

测试

代码如下(示例):

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

/*
//给二位数组排序
//第一维按从大到小,如果第一维相等,按第二维从大到小排序
static bool cmp(const vector<int>& v1, const vector<int>& v2)
{
	if (v1[0] == v2[0])
	{
		return v1[1] > v2[1];
	}
	else
	{
		return v1[0] > v2[0];
	}
}
//暴力解法--二维数组排序
vector<int> topKFrequent(vector<int>& nums, int k)
{
	vector<int> topFrequent;
	vector<vector<int>> map;
	map.push_back({ 0,nums[0] });
	for (int i = 1; i < nums.size(); ++i)
	{
		int index = -1;
		for (int j = 0; j < map.size(); ++j)
		{
			if (nums[i] == map[j][1])
			{
				++map[j][0];
				index = 0;
				break;
			}
		}
		if (index == -1)
		{
			map.push_back({ 0,nums[i] });
		}
	}
	sort(map.begin(), map.end(), cmp);
	for (int i = 0; i < k; ++i)
	{
		topFrequent.push_back(map[i][1]);
	}
	return topFrequent;
}*/
/*
* 如何给unordered_map 按照value进行排序
* 需要重写sort中的排序
* unordered_map不能直接排序,需要使用pair存在vector中
*/
static bool comp(pair<int, int>& m, pair<int, int>& n)
{
	return m.second > n.second;
}

//哈希表排序
vector<int> topKFrequent(vector<int>& nums, int k)
{
	vector<int> newNums(k, 0);
	unordered_map<int, int> map;
	for (auto& num : nums)
	{
		++map[num];
	}

	vector<pair<int, int> > b;
	for (auto x : map)
	{
		b.push_back(x);
	}

	sort(b.begin(), b.end(), comp);
	int index = 0;
	for (auto i : b)
	{
		newNums[index] = i.first;
		index++;
		if (index == k)
		{
			break;
		}
	}
	return newNums;
}

int main()
{
	vector<int> nums = { 4,1,-1,2,-1,2,3 };
	int k = 2;
	vector<int> newNums = topKFrequent(nums, k);
	for (int i = 0; i < k; i++)
	{
		cout << newNums[i] << " ";
	}
	return 0;
}

结果

在这里插入图片描述


总结

在这里插入图片描述

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

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

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

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

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

力扣347. 前 K 个高频元素与C++stl优先队列(大小根堆)的自定义排序用法总结

力扣347. 前 K 个高频元素与C++stl优先队列(大小根堆)的自定义排序用法总结