leetcode 前 K 个高频元素 python3

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

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

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

提示:

你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。
你可以按任意顺序返回答案。

from collections import defaultdict

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        foo = defaultdict(int)
        count = 0
        ans = []
        for i in range(len(nums)):
            if nums[i] not in foo.keys():
                xx={nums[i]:1}
                foo.update(xx)
            else:
                foo[nums[i]]+=1
        res = sorted(foo.items(),key=lambda item:item[1],reverse=True)
        return list(map(lambda x:x[0],res))[:k]
dit={}                   #{元素值:出现频率}                
        for i in nums:           #使用字典的特性(相同元素后面值的会覆盖前面的值)统计元素的频率,时间复杂度为O(N)
            if i not in dit:     #如果不存在,则将其存入字典中,此时该值的出现频率为1
                dit[i] = 1
            else:                #如果已经存在,则其出现频率加1
                dit[i] =  dit[i]+1

        temp = []                     #由于字典无法排序,因此需要先将字典转换为列表,列表中的每一个元素为 键-值 构成的元祖
        for item in dit.items():      #使用字典的items函数,获取 键-值对元祖列表
            temp.append(item[::-1])   #这里需要对出现频率进行排序,因此将每一个元祖元素进行转置
        
        # temp = list(map(lambda x:(x[1],x[0]),dit.items()))  #上面的for循环也可以这样实现

        temp.sort(reverse=True)       #对列表进行排序,对于每一个元素都是元祖的列表来说,其排序是按照元祖的第一个元素进行的
        return [temp[i][1] for i in range(k)]  #使用列表推导式求前k个高频元素

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        freq = dict()
        for i in nums:
            if i not in freq:
                freq[i] = 1
            else:
                freq[i] += 1
        keys_freq = []
        keys = []
        for i in freq:
            keys = freq.keys()
            keys_freq.append(freq[i])
        tmp = sorted(keys_freq)
        min_k = tmp[-k]
        result = []
        for i in keys:
            if freq[i] >= min_k:
                result.append(i)
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值