[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)

相关推荐
Q_Q196328847518 分钟前
python的抗洪救灾管理系统
开发语言·spring boot·python·django·flask·node.js·php
Cyanto25 分钟前
SpringMVC核心注解:@RequestMapping详解
java·开发语言
程序边界29 分钟前
大模型Agent应用开发实战:从框架选型到行业落地
开发语言·javascript·ecmascript
CoovallyAIHub32 分钟前
YOLO11 vs LMWP-YOLO:参数量-52.5%,mAP+22.07%,小型无人机的远距离检测
深度学习·算法·计算机视觉
地平线开发者38 分钟前
【理想汽车智驾方案介绍专题 -1】端到端+VLM 方案介绍
算法·自动驾驶·汽车
lishaoan771 小时前
用Python实现神经网络(二)
开发语言·python·神经网络
KyollBM1 小时前
【Luogu】每日一题——Day4. P5804 [SEERC 2019] Absolute Game (思维 博弈论)
数据结构·c++·算法
君莫默1 小时前
代码随想录-250716-图的读入与构建
数据结构·算法
托马斯-酷涛1 小时前
基于Echarts的气象数据可视化网站系统的设计与实现(Python版)
python·信息可视化·echarts
Rita的程序bug1 小时前
R语言基础| 基本图形绘制(条形图、堆积图、分组图、填充条形图、均值条形图)
开发语言·信息可视化·r语言