Leetcode题347、前K个高频元素(Python题解)Amazon面试题

本文介绍了LeetCode第347题的四种解法,包括使用Python的Counter、堆、桶排序和快速排序。重点讨论了这些方法的适用场景和时间复杂度,均为O(nlogn)。

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

问题
在这里插入图片描述

题目来源:力扣(LeetCode)

leetcode347.前K个高频元素

难度:中等

分析
本题解提供四种方法,分别是python的Counter技巧、堆、桶排序、快排。
对于python语言来说,这道题可以用python技巧一行做完,Counter的计数排序功能太强大。
堆天生适合求前k个最大/最小值。
桶适合计数排序的题目。
快排思想也适合寻找k大、k小元素。

解决方法
1:Counter技巧

#python技巧
#直接使用Counter计数,直接取频数最大的几位
#collections.Counter(nums).most_common(k)代表取频数最大的k位,key和value打包成元组储存在列表中。
#*代表不确定几位,可有多位
#zip将对应位置元素打包成元组
#打包完后,第0个元素就是要求的,但是zip类型不能直接取,得先变成list,然后取第0位。
import collections
class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        return list(zip(*collections.Counter(nums).most_common(k)))[0]

复杂度:O(nlogn)

2:堆方法

#堆方法
#python维护的是最小堆。频数取反入队。先将所有数据的频数和它本身一起存到堆里。频数取反,这样每一次取到的都是最小值,也就是实际上的最大值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值