[python 刷题] 347 Top K Frequent Elements

python 刷题 347 Top K Frequent Elements

题目:

Given an integer array nums and an integer k, return the k most frequent elements . You may return the answer in any order.

一般来说看到 any order 可以默认这题跟 dict/map/set 有关,这题的话依旧是用 dict 存储数字和出现的频率,随后根据 dict 中值进行排序,获取 top k 的数字。

在最差情况下,这个算法的时间复杂度为 O ( n l o g ( n ) ) O(n log(n)) O(nlog(n))------就是排序的耗时,解法如下:

python 复制代码
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map = {}

        for num in nums:
            map[num] = map.get(num, 0) + 1

        sorted_map = sorted(map.items(), key=lambda x: x[1], reverse=True)
        res = []

        for i in range(k):
            res.append(sorted_map[i][0])

        return res

sorted() 这个函数的语法为:sorted(iterable, key=key, reverse=reverse),iterable 比较简单,key 的话排序的依据,默认为 None,reverse 也比较直接。

lambda 在 python 中就是一个比较方便创建小型匿名函数的方法。

这个案例中,使用 sorted_map = sorted(map.items(), key=lambda x: -x[1],得出的结果也一样。

sorted() 会返回一个数组,不过在 dict 的情况下,返回的是 tuples 的数组,以 [1,1,1,2,2,3] 为例:

  • map 的结果为 {1: 3, 2: 2, 3: 1},即数字与频率的键值对
  • sorted_map 的结果为 [(1, 3), (2, 2), (3, 1)],即频率与出现的数字的 tuple

个人觉得 python 的各种函数是真的很方便......

另一个更加优化的写法是:

python 复制代码
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        count = {}
        freq = [[] for i in range(len(nums) + 1)]

        for n in nums:
            count[n] = 1 + count.get(n, 0)
        for n, c in count.items():
            freq[c].append(n)

        res = []
        for i in range(len(freq) - 1, 0, -1):
            for n in freq[i]:
                res.append(n)
                if len(res) == k:
                    return res

这个写法的优势在于时间复杂度为 O ( n ) O(n) O(n),依旧以 [1,1,1,2,2,3] 为例,最后 freq 的值为 [[], [3], [2], [1]],下标(index) 对应数字出现的频率。这也就是为什么初始化的时候,freq 的大小为 len(nums) + 1

这个解法肯定是更优的,最差情况下二者的时间复杂度都为 O ( n ) O(n) O(n),但是这里的空间复杂度就少了一个 l o g ( n ) log(n) log(n)

相关推荐
橘子汽水16841 分钟前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子1 小时前
Adaboost算法原理与计算实例
算法
别怪我很水1 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
就是一只白1 小时前
复制地理信息python版本
python
看浪的路人1 小时前
第1讲:Agent 到底是什么?和 Chatbot 有什么区别
python·ai
名字还没想好☜1 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
瓦学妹2 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
天天爱吃肉82182 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车
海盗12343 小时前
微软技术周报 ——2026-08-03
后端·python·microsoft·c#·.netcore