LeetCode 347 前 K 个高频元素

LeetCode 347 前 K 个高频元素

题目描述

题目链接
给定一个整数数组 nums 和一个整数 k,请返回其中出现频率前 k 高的元素。

解题思路

哈希表 + 堆排序法

  1. 频率统计阶段:使用哈希表统计元素出现频率
  2. 堆排序优化:通过维护最小堆来快速获取前k大元素
  3. 结果提取:从堆中提取排序后的结果

步骤说明

# leetcode 347
# 前k个高频元素
# https://leetcode.cn/problems/top-k-frequent-elements/description/
# 解法:
from typing import List
import heapq
from collections import Counter


class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        # 统计频率(哈希表O(n)freq = Counter(nums)  # 例如 nums=[1,1,2] {1:2, 2:1}
        
        # 构建堆元素(频率在前用于排序)
        heap = [(count, num) for num, count in freq.items()]  # [(2,1), (1,2)]
        
        # 获取前k大元素(堆排序O(nlogk)return [num for count, num in heapq.nlargest(k, heap)]


if __name__ == "__main__":
    # 测试用例(题目示例)
    nums = [1, 1, 1, 2, 2, 3]
    k = 2
    print(Solution().topKFrequent(nums, k))  # 预期输出:[1, 2]

关键点解析

  1. 最小堆的选择 :

    • 维护容量为k的最小堆
    • 新元素频率 > 堆顶时进行替换
    • 最终堆中保留最大的k个元素
  2. 复杂度优化 :

    • 直接排序复杂度:O(nlogn)
    • 堆排序复杂度:O(nlogk)(k远小于n时优势明显)

时间复杂度:O(nlogk)
空间复杂度:O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值