当前位置: 首页 > news >正文

【leetcode】347. 前k个高频元素

文章目录

    • 题目
    • 题解
      • 1. 字典+排序
      • 1. 字典+最小堆

题目

347. 前k个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

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

示例 2:

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

题解

1. 字典+排序

nlog(n)

class Solution(object):def topKFrequent(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""dict_result = {}for num in nums:if num not in dict_result:dict_result[num] = 1else:dict_result[num] += 1sorted_list = sorted(dict_result.items(), key=lambda item: item[1], reverse=True)result = []for i in range(k):result.append(sorted_list[i][0])return result

1. 字典+最小堆

nlog(k)

class Solution(object):def topKFrequent(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""# 字典:nlog(n)dict_result = {}for num in nums:if num not in dict_result:dict_result[num] = 1else:dict_result[num] += 1#对频率排序#定义一个小顶堆,大小为kpri_que = [] #小顶堆for key, freq in dict_result.items():# 最小堆heapq.heappush(pri_que, (freq, key))if len(pri_que) > k:heapq.heappop(pri_que)result = [0] * kfor i in range(k-1, -1, -1):result[i] = heapq.heappop(pri_que)[1]return result
  • 统计频次:首先使用字典 dict_result 统计每个数字的频率。

  • 最小堆:通过 heapq 模块来实现最小堆,堆中存储的是 (频次, 数字) 元组。

  • 每次将一个 (freq, num) 元组插入堆中。如果堆的大小超过了 k,则移除堆顶元素(频率最小的元素)。这样堆中始终保存的是频率最高的 k 个元素。

  • 结果提取:从堆中提取出 k 个数字,并返回这些数字。

  • 时间复杂度:
    O(n log k):遍历 nums 中的 n 个元素,每次操作堆的时间复杂度为 O(log k),因此总时间复杂度为 O(n log k)。

heapq 是 Python 内置的一个模块,用于实现 堆队列算法(也称为优先队列)。该模块提供了一个基于列表的最小堆实现。最小堆是一个二叉堆,其中每个父节点的值都小于或等于其子节点的值,因此堆顶总是最小的元素。

主要功能: 最小堆:heapq 默认实现的是最小堆(即堆顶是最小的元素)。可以用它来管理优先级队列等问题,自动保持元素的排序。

  • 堆排序:通过使用 heapq,可以高效地获取最小或最大元素。

  • 支持堆操作:heapq 提供了用于堆操作的几种函数,最常用的包括:

    • heappush(heap, item):将元素 item 添加到堆中,保持堆的性质。

    • heappop(heap):弹出堆顶元素(即最小元素),并保持堆的性质。

    • heapify(list):将一个列表转化为堆。

    • heappushpop(heap, item):将元素 item 添加到堆中并弹出堆顶元素。

    • heapreplace(heap, item):弹出堆顶元素,并将 item 添加到堆中。

最小堆的性质: 每个父节点的值都小于或等于其子节点的值,这使得堆顶元素始终是最小的元素。

在 heapq 模块中,堆是用列表实现的,列表的第一个元素始终是堆顶元素。

http://www.lqws.cn/news/169363.html

相关文章:

  • 动态规划-1035.不相交的线-力扣(LeetCode)
  • 微服务网关SpringCloudGateway+SaToken鉴权
  • Vue3入门指南:从零到精通的快速上手
  • CSS3相关知识点
  • linux——磁盘和文件系统管理
  • [蓝桥杯]植树
  • 强化学习入门:Gym实现CartPole随机智能体
  • 五、Sqoop 增量导入:精通 Append 与 Lastmodified 模式
  • Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
  • 世事无常,比较复杂,人可以简单一点
  • 基于大模型的原发性醛固酮增多症全流程预测与诊疗方案研究
  • 45、web实验-抽取公共页面
  • Java中的阻塞队列
  • c++ chrono头文件含义
  • float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
  • java32
  • GO协程(Goroutine)问题总结
  • SpringCloud——OpenFeign
  • 6.5本日总结
  • 时序预测模型测试总结
  • 汇编语言综合程序设计:子程序、分支与循环深度解析
  • 【大模型:知识库管理】--开源工具Ragflow介绍+本地搭建
  • I2C通信讲解
  • Linux 下生成动态库时 -fPIC的作用详解
  • Monorepo架构: Lerna、NX、Turbo等对比与应用分析
  • 系统思考持续训练
  • 湖北理元理律所债务优化实践:法律技术与人文关怀的双轨服务
  • 【Zephyr 系列 9】Zephyr 与设备树机制详解:如何为你的板子编写 Devicetree
  • 农田水利如何「聪明」起来?Modbus转Ethernet IP破解设备互联
  • [蓝桥杯]后缀表达式