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

Leetcode Day18 堆

Python中关于堆的操作

注意, python默认的是最小堆

在这里插入图片描述

什么时候想到用堆

A: 流!或者我们只关心k个元素

373 查找和最小的前k对数字

给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。

请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:m = len(nums1)n = len(nums2)visited = set()ans = []h = []heappush(h, (nums1[0] + nums2[0], 0, 0))visited.add((0, 0))while len(ans) < k:num, i, j = heappop(h)ans.append([nums1[i], nums2[j]])if (i + 1, j) not in visited and i + 1 < m and j  < n:heappush(h, (nums1[i+1] + nums2[j], i+1, j))visited.add((i+1, j))if (i, j + 1) not in visited and i < m and j + 1 < n:heappush(h, (nums1[i] + nums2[j + 1], i, j + 1))visited.add((i, j+1))return ans

后面的优化就是怎么样能不用hashset

换个角度,如果要把 (i,j) 入堆,那么之前出堆的下标对是什么?
根据上面的讨论,出堆的下标对只能是 (i−1,j) 和 (i,j−1)。
只要保证 (i−1,j) 和 (i,j−1) 的其中一个会将 (i,j) 入堆,而另一个什么也不做,就不会出现重复了!
不妨规定 (i,j−1) 出堆时,将 (i,j) 入堆;而 (i−1,j) 出堆时只计入答案,其它什么也不做。
换句话说,在 (i,j) 出堆时,只需将 (i,j+1) 入堆,无需将 (i+1,j) 入堆。
但若按照该规则,初始仅把 (0,0) 入堆的话,只会得到 (0,1),(0,2),⋯ 这些下标对。
所以初始不仅要把 (0,0) 入堆,(1,0),(2,0),⋯ 这些都要入堆。

class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:ans = []h = [(nums1[i] + nums2[0], i, 0) for i in range(min(len(nums1), k))]while len(ans) < k:_, i, j = heappop(h)ans.append([nums1[i], nums2[j]])if j + 1 < len(nums2):heappush(h, (nums1[i] + nums2[j + 1], i, j + 1))return ans

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

O ( n l o g n ) O(nlogn) O(nlogn)的算法显然很简单, 但有没有方法可以降一下这个呢? 事实上, 我们只关心前k个, 我们变能把复杂度降为 O ( n l o g k ) O(nlogk) O(nlogk), 那么能保持这个前k个元素的结构自然就是堆了.

class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:frequencyMap = {}for num in nums:if num in frequencyMap:frequencyMap[num] += 1else:frequencyMap[num] = 1minHeap = []for item, freq in frequencyMap.items():print(minHeap)if len(minHeap) < k:heappush(minHeap, (freq, item))else:top_node = minHeap[0]if freq > top_node[0]:heappop(minHeap)heappush(minHeap, (freq, item))return [num for freq, num in minHeap]

23 合并k个升序链表

ListNode.__lt__ = lambda a, b: a.val < b.val  # 让堆可以比较节点大小class Solution:def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:cur = dummy = ListNode()  # 哨兵节点,作为合并后链表头节点的前一个节点h = []for head in lists:if head:h.append(head)heapify(h)  # 堆化while h:  # 循环直到堆为空node = heappop(h)  # 剩余节点中的最小节点if node.next:  # 下一个节点不为空heappush(h, node.next)  # 下一个节点有可能是最小节点,入堆cur.next = node  # 合并到新链表中cur = cur.next  # 准备合并下一个节点return dummy.next  # 哨兵节点的下一个节点就是新链表的头节点

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • EventBus搭配LifeCycle可能更美味
  • 大模型笔记01--基于ollama和open-webui快速部署chatgpt
  • 51单片机-定时器介绍
  • 模型 冯/诺依曼思维模型
  • 《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(2)
  • 【Java开发】Maven安装配置详细教程
  • python模块06 mock-1基础用法
  • JavaWeb:实验一JSP运行环境安装及配置
  • 5.Redis 集群 主从复制 哨兵
  • Mybatis 是如何进行分页的?分页插件的原理是什么?
  • java构建工具-maven的复习笔记【适用于复习或者初步了解】
  • WebView快速打开
  • 公司招聘中,多个面试官对候选人评价不一致怎么办?
  • class 3: vue.js 3 计算属性
  • Java中的注解(Annotation)
  • canvas 绘制双线技巧
  • CSS实用技巧
  • Logstash 参考指南(目录)
  • ReactNative开发常用的三方模块
  • sessionStorage和localStorage
  • tab.js分享及浏览器兼容性问题汇总
  • Vue2.0 实现互斥
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 面试总结JavaScript篇
  • 批量截取pdf文件
  • 七牛云假注销小指南
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 驱动程序原理
  • 用Visual Studio开发以太坊智能合约
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​iOS实时查看App运行日志
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (AngularJS)Angular 控制器之间通信初探
  • (Java数据结构)ArrayList
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)hibernate配置管理
  • (二)JAVA使用POI操作excel
  • (十六)一篇文章学会Java的常用API
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)大型网站架构演变和知识体系
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET基础篇——反射的奥妙
  • .net中我喜欢的两种验证码
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [ Python ]使用Charles对Python程序发出的Get与Post请求抓包-解决Python程序报错问题
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [Android 13]Input系列--获取触摸窗口
  • [Angular 基础] - 数据绑定(databinding)