栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

前k个高频元素(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

前k个高频元素(C++)

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

leetcode链接

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

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

思路:

  1. 统计每个元素出现次数,我们可以使用unordered_map
  2. 然后按出现频率给元素排序,可以考虑最小堆。优先队列是用堆实现的,可以使用优先队列。

代码:

class Solution {	//前K个高频元素
public:
	class mycomparison {	//升序
	public:
		bool operator()(const pair& Ihs, const pair& rhs) {
			return Ihs.second > rhs.second;
		}
	};
	vector topKFrequent(vector& nums, int k) {
		vector result(k);
		unordered_map umap;
		for (int i : nums) {
			umap[i]++;
		}
		
		//定义小顶堆
		priority_queue, vector>, mycomparison> pri_que;
		unordered_map::iterator iter;
		for (iter = umap.begin(); iter != umap.end(); ++iter) {
			pri_que.push(*iter);
			if (pri_que.size() > k) {	//保证堆里元素一直为k个
				pri_que.pop();
			}
		}

		for (int i = k - 1; i >= 0; --i) {
			result[i] = pri_que.top().first;
			pri_que.pop();
		}
		return result;
	}
};

int main() {

	vector nums = { 1, 1, 1, 2, 2, 3 };
	int k = 2;
	Solution s;
	vector result = s.topKFrequent(nums, k);
	for (int i : result){
		cout << i << "t";
	}
	cout << endl;
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942471.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号