前 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 个高频元素--力扣的主要内容,如果未能解决你的问题,请参考以下文章