Leetcode Day18 堆

news2024/11/15 17:50:31

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] += 1
            else:
                frequencyMap[num] = 1

        minHeap = []
        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  # 哨兵节点的下一个节点就是新链表的头节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Learing——protobuf(一)

目录 前言 一、protobuf的简介 二、编写一个.proto文件 1.选择使用的protobuf版本 2.指定命名空间&#xff08;package&#xff09; 3.定义一个“消息”&#xff08;message&#xff09; 4.定义消息字段 标量类型&#xff1a; 枚举类型(enum): 多选一类型(oneof)&…

论文速读|I-CTRL:通过受限强化学习使人型机器人模仿和控制

论文地址&#xff1a;https://arxiv.org/pdf/2405.08726 I-CTRL&#xff08;Imitation to Control Humanoid Robots Through Constrained Reinforcement Learning&#xff09;是一个旨在解决现有人类运动到人型机器人的转换方法在物理可行性上的不足的框架。该框架通过在非物理…

基础闯关3

一、基础任务 大模型在浮点数大小比较上表现不佳&#xff0c;直接询问大模型浮点数大小往往会出现错误&#xff0c;而通过设定适当的提示词可以引导大模型生成正确的答案。提示工程是指设计和优化输入提示&#xff08;prompts&#xff09;的过程&#xff0c;这些提示用于指导大…

一网统管政企联动:计讯构建城市生命线安全智能体的应急管理革新

城市生命线国家政策推动生命线风险频发 随着城市化进程加速&#xff0c;城市安全问题日益凸显&#xff0c;包括自然灾害、建筑老化、环境污染和公共卫生事件等潜在风险。城市不仅要更新“硬设施”&#xff0c;更在于通过大数据、云计算、5G等新兴技术提升城市管理的“软实力”。…

three.js 开发粒子系统

在 three.js 中开发粒子系统&#xff0c;你通常会使用 THREE.Points 和 THREE.PointsMaterial。这些组件允许你创建一个由大量点组成的系统&#xff0c;每个点都可以代表一个粒子&#xff0c;并可以自定义其大小、颜色、透明度等属性。以下是一个基本的步骤指南&#xff0c;用于…

赞奇科技与华为云共襄828 B2B企业节,激活数字内容“云”创作

8月28日&#xff0c;在2024中国国际大数据产业博览会上&#xff0c;第三届828 B2B企业节正式开幕&#xff0c;旨在融通数智供需&#xff0c;加速企业智改数转&#xff0c;助推中国数智产业实力再升级。 828 B2B企业节是全国首个基于数字化赋能的企业节&#xff0c;由华为联合上…

kafka安装配置、以及遇到闪退问题的解决办法

一、Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装 zookeeper 详细安装过程参见这位大神写的博客 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写_windows kafka-CSDN博客 注…

【C++11及其特性】智能指针——unique_ptr

unique_ptr目录 一.排他所有权模式二.auto_ptr的缺点1.可以直接复制和拷贝构造2.STL可以直接赋值3.不支持动态内存分配数组 三.unique_ptr(C11)1.不支持直接赋值和构造2.STL可以不可以直接赋值3.支持动态内存分配数组 四.unique_ptr的用法1.构造函数2.赋值操作3.主动释放对象4.…

免费的电脑录屏软件,这几款软件满足录屏需求!

在数字化时代&#xff0c;电脑录屏已成为我们日常生活和工作中不可或缺的一部分。无论是教学演示、游戏直播、会议记录&#xff0c;还是视频创作&#xff0c;一款优秀的录屏软件都是不可或缺的。今天&#xff0c;就为大家推荐几款免费、高效、易用的电脑录屏软件&#xff0c;帮…

首批国自然博士项目获批名单

【SciencePub学术】从公开新闻来看&#xff0c;已经有20所高校的博士生获批项目&#xff0c;分别是北京大学、清华大学、北京航空航天大学、东南大学、复旦大学、华中科技大学、吉林大学、兰州大学、南方科技大学、南开大学、山东大学、上海交通大学、四川大学、武汉大学、南京…

VSCode必备插件!快看过来!

同学同学&#xff0c;你是不是也很头疼VSCode不知道安装什么插件啊&#xff1f;尤其是萌新小白&#xff0c;更是一头雾水&#xff0c;那就快来一起看看吧~我帮你整理了一些非常实用的插件&#xff0c;安装上它们&#xff0c;你的开发体验会大大提升&#xff01; 1. Chinese (S…

DWG如何转换成PDF?总结了四种转换

DWG如何转换成PDF&#xff1f;在日常工作和学习中&#xff0c;经常需要将CAD软件中的DWG文件转换为PDF格式&#xff0c;以便于更广泛地分享和查阅。那么具体要怎么做&#xff0c;才能实现两种格式的顺利转换呢&#xff1f;为了帮助读者轻松完成这一任务&#xff0c;本文将详细介…

网络价格管控行动:四大策略,打击低价

网络价格管控的举措 设定最低售价约束&#xff1a;品牌方能够与在线零售商订立协议&#xff0c;清晰界定产品的最低售价&#xff0c;以守护品牌形象与市场秩序。推行动态定价策略&#xff1a;依照市场需求、竞争态势以及库存状况动态调节产品价格&#xff0c;保障市场竞争力并…

Java爬虫开发:Jsoup库在图片URL提取中的实战应用

在当今的互联网时代&#xff0c;数据的获取和处理变得尤为重要。对于网站内容的自动化抓取&#xff0c;爬虫技术扮演着不可或缺的角色。Java作为一种广泛使用的编程语言&#xff0c;拥有丰富的库支持网络爬虫的开发。其中&#xff0c;Jsoup库以其简洁、高效的特点&#xff0c;成…

51单片机 - 定时器0(按键控制LED流水灯模式)

时间&#xff1a;2024.9.2 目的&#xff1a;手撕51 作者&#xff1a;Whappy 定时器0寄存器配置 1.定时器0配置过程 首先要配置定时器的寄存器TCON和TMOD使计数器开始计数及定时器的初始值&#xff0c;配置使这个链路连起来。 #include <REGX52.H>void Timer0_Init() {…

【HarmonyOS 4.0】鸿蒙应用模型

应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&#xff0c;使应用开发更简单、高效。随着系统的演进发展&#xff0c;HarmonyOS先后提供…

java 实现文本转音频

文章目录 一、前言二、实现流程2.1 下载jacob-1.18.zip2.2 拷贝jacob-1.18-x64.dll2.3 pom 添加依赖2.4 代码实现 一、前言 本文基于Windows自带的SAPI.SpVoice&#xff0c;通过java代码实现文本转语音的功能。 二、实现流程 2.1 下载jacob-1.18.zip 链接&#xff1a;https…

红帽认证初级有用吗?对个人帮助,报名时间分享

红帽认证初级即红帽认证系统管理员&#xff08;RHCSA&#xff09;是有用的。 拥有 RHCSA 认证的管理员掌握了 Linux 操作系统的基本知识和技能&#xff0c;能够准确理解和解决系统操作中的各种问题。他们了解并熟悉 Linux 命令行和 GUI 界面&#xff0c;可以高效地完成各种任务…

OpenCV绘图函数(15)图像上绘制矩形函数 rectangle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 绘制一个简单的、粗的或填充的直立矩形。 这个函数 cv::rectangle 绘制一个矩形轮廓或一个填充的矩形&#xff0c;其两个相对的顶点分别是 pt1 和…

大数据-114 Flink DataStreamAPI 程序输入源 自定义输入源 Rich并行源 RichParallelSourceFunction

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…