[LeeCode] 347. Top K Frequent Elements (Python) 最小堆/ 桶排序

347. Top K Frequent Elements

Medium

Given a non-empty array of integers, return the k most frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

Input: nums = [1], k = 1
Output: [1]

Note: 

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
  • It's guaranteed that the answer is unique, in other words the set of the top k frequent elements is unique.
  • You can return the answer in any order.

 

笔记:

方法1:使用最小堆,使用heapq的heapq.nlargest()函数。时间复杂度O(n + klog n)

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        cnt_nums = collections.defaultdict(int)
        for num in nums:
            cnt_nums[num] += 1
        temp = heapq.nlargest(k, cnt_nums.items(), key=lambda x:x[1])
        rlt = []
        for i in temp:
            rlt.append(i[0])
        return rlt

 

方法2:桶排序 时间复杂度O(n)

list倒叙访问 for i in range(len(nums) - 1, -1, -1)  最后一个-1代表每次没迭代一次,i就减一

list.extend(a)  一次添加一个list,比如a=[1,2,3].

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        cnt_nums = collections.defaultdict(int)
        for num in nums:
            cnt_nums[num] += 1
        bucket = [[]for i in range(len(nums) + 1)]
        for key, val in cnt_nums.items():
            bucket[val].append(key)
        rlt = []
        for i in range(len(bucket) - 1, -1, -1):
            if bucket[i]:
                rlt.extend(bucket[i])
            if len(rlt) >= k:
                break
        return rlt

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值