【力扣347前k个高频元素】

本文介绍了如何使用C++解决LeetCode347题——前k个高频元素。作者通过unordered_map实现元素及其出现次数的映射,然后用桶排序或计数排序的思想找出出现频率前k高的元素。代码展示了如何找到并返回这些高频元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣347前k个高频元素

原题地址

题目描述

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

示例 1:

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

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

AC代码

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
    	// 处理元素和元素的出现次数的映射
    	// 例如1, 1, 1,表示1出现了3次
    	// 则map[1] = 3
        unordered_map<int, int> map;
        for (auto x : nums) map[x] ++ ;
		
		// 采用桶排序/计数排序的思想
		// 桶排序/计数排序映射元素出现次数和元素本身(原本思想)
		// 对应本题元素出现次数和元素个数
		// 例如:1, 1, 2
		// 则s[0] = 0,表示出现0次(索引/下标)的元素有0个(值)
		// 则s[1] = 1,表示出现1次个元素有一个
		// s[2] = 1,出现两次的元素有1一个
        int n = nums.size();
        vector<int> s(n + 1);
        for (auto [x, c] : map) s[c] ++ ;

		// 统计出次数最多的前k个元素的下界
		// 例如:1,1,2且k = 1
		// 则s[0] = 0,表示出现0次的元素有0个
		// 则s[1] = 1,表示出现1次个元素有一个
		// s[2] = 1,出现两次的元素有1一个
		// 那么显然,下界为1
        int i = n, t = 0;
        while (t < k) t += s[i -- ];
        
        // 此时从hash表里查找出现次数大于1的元素
		// 显然答案:key = 1, val = 2(1出现2次)
        vector<int> res;
        for (auto [x, c] : map)
            if (c > i)
                res.push_back(x);

        return res;
    }
};

思路

见注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值