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

hot100 -- 13.堆系列

1.数组中的第K个最大元素

方法1:排序

# 方法1:排序
def FindK(nums, k):nums = sorted(nums, reverse=True)return nums[k-1]

时间复杂度O(nlogn) (排序)

方法2:最小堆(用最小堆维护最大的K个数)

# 方法2:堆(用最小堆维护最大的K个数)
import heapq
def FindK(nums, k):heap = []for num in nums:heapq.heappush(heap, num)if len(heap) > k:heapq.heappop(heap)return heap[0]

时间复杂度O(nlogk)  (遍历n,堆插入和弹出是logk)

方法3:快速选择

# 方法3:快速选择
def FindK(nums, k):# 分区,并确定基准最终位置(左边必然比pos大,右边必然比pos小)def partition(left, right):pivot, pos = right, left                            # 设置基准位置 和 基准的最终位置for i in range(left, right):if nums[i] >= nums[pivot]:                      # 和基准对比,大的从前面开始放nums[i], nums[pos] = nums[pos], nums[i]     # 交换大值,放到前面pos += 1nums[right], nums[pos] = nums[pos], nums[right]     # 放基准元素到它的最终位置return posleft, right = 0, len(nums) - 1while True:pos = partition(left, right)    # 分区if pos == (k-1):                # 对比当前位置 和 目标位置(k-1)return nums[pos]elif pos > (k-1):right = pos - 1else:left = pos + 1

时间复杂度:平均O(n)  ,最坏O(n^2)

2.前 K 个高频元素

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

方法1:哈希表

# 方法1:哈希表 + 排序
import collections
def TopKFreq(nums, k):hash = collections.defaultdict(int)# 统计频率for num in nums:hash[num] += 1freq = sorted(hash.items(), key=lambda x:x[1], reverse=True)    # 直接根据频率对哈希表排序return [num[0] for num in freq[:k]]

方法2:最小堆

# 方法2:最小堆
import heapq
import collections
def TopKFreq(nums, k):hash = collections.defaultdict(int)heap = []# 统计频率for num in nums:hash[num] += 1for num, freq in hash.items():heapq.heappush(heap, [freq, num])       # 最小堆(对首个元素freq筛选)if len(heap) > k:heapq.heappop(heap)return [num[1] for num in heap]

http://www.xdnf.cn/news/14394.html

相关文章:

  • MongoDB使用安全的sha256认证
  • 【Elasticsearch】文档(二):更新
  • FPGA中的DMA技术
  • 制作微PE U盘后电脑多出300M盘符(EFI分区)无法隐藏的解决过程
  • Vue3 Pinia Store 生命周期管理
  • 前端开发面试题总结-vue2框架篇(二)
  • 国产替代新标杆|盟接之桥EDI软件让中国制造连接世界更安全、更简单、更有底气
  • AI for Science:智能科技如何重塑科学研究
  • 机器能做科学家吗?一场关于开放式科研的 AI 革命
  • 人工智能嵌入公共服务治理的风险挑战(三)
  • day31 文件的规范拆分和写法
  • 多线程与多进程技术全景对比
  • 平均数与倍数
  • 地理空间视角下的 SIR 传染病模型模拟与可视化
  • ObservedV2装饰器和Trace装饰器
  • 浏览器拨打电话 nginx代理wss (mod_cti基于FreeSWITCH)
  • 山东大学软件学院创新项目实训开发日志——第十六周
  • 【Python打卡Day40】训练与测试的规范写法 @浙大疏锦行
  • LeCun破局:大模型与人类思考的本质分野
  • 快速学习GO语言总结
  • JNDI注入入门
  • jetson nano 无法启动排查实录:使用i2c误写 EEPROM (地址 0x50)引发的修复经历
  • RT1176 QDEC引脚全解析:精准定位编码器接口资源
  • 内容风控概念基础
  • 前端基础知识CSS系列 - 03(em/px/rem/vh/vw)
  • WiFi7无线桌面式AP天线系统设计
  • 【CATIA的二次开发29】抽象对象Document涉及文档标识的属性
  • MLLM常见概念通俗解析(五)
  • Vue3 实现老虎机抽奖游戏
  • linux-进程管理