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

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]

相关文章:

  • android CALL 之 RIL、TELEDCOM、PHONE
  • SpringCloud Alibaba场景实践(Nacos篇)
  • c++ algorithm常用算法汇总
  • 13分钟讲解主流Linux发行版
  • 数据库优化实战分享
  • 设备健康管理系统搭建全技术解析:从架构设计到智能运维实践
  • Flink CDC MySQL 时区相差 8 小时问题优雅解决方式
  • 华为OD机试-考勤信息-双指针(JAVA 2025B卷)
  • 第五章:执行计划分析 - 读懂MySQL的执行策略
  • Nginx 配置中·IP地址变量
  • leetcode148-排序链表
  • SimpleQtLogger 使用总结
  • Nginx全面深入学习目录
  • 我的JavaWeb软件开发作品学生信息管理系统项目/JavaWeb软件开发 课程考察标准
  • OmniMeetProTrack 全维会议链智能追录系统——山东大学软件学院创新实训项目博客(六)
  • 零基础学前端-传统前端开发(第四期-JS基础-语法,语句)
  • 【SQLAlchemy系列】 SQLAlchemy 中的多条件查询:or*与 in*操作符
  • 【Docker基础】Docker核心概念:命名空间(Namespace)之PID详解
  • java+vue+SpringBoo旅游网(程序+数据库+报告+部署教程+答辩指导)
  • Spring-ai 1.0.0 学习(二)——最小化样例
  • 成都 做网站 模版/营销推广软文案例
  • 确定网站推广的阶段目标/seo是什么服务
  • led外贸网站制作/打造龙头建设示范
  • 北京商城网站开发公司/seo网络优化专员
  • 支付公司网站建设费账务处理/新冠疫情最新情况
  • 宝鸡做网站公司/网络推广平台排名