力扣hot100题解(python版33-35题)

33、排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

示例 1:

img

输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

img

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目在范围 [0, 5 * 104]
  • -105 <= Node.val <= 105

思路解答:

  1. 使用快慢指针找到链表的中点,将链表分为两部分。
  2. 递归地对左右两部分链表进行排序。
  3. 合并两个已排序的链表。
def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:if not head or not head.next:return headdef getMiddle(head):slow = headfast = headwhile fast.next and fast.next.next:slow = slow.nextfast = fast.next.nextreturn slowdef merge(left, right):dummy = ListNode(0)current = dummywhile left and right:if left.val < right.val:current.next = leftleft = left.nextelse:current.next = rightright = right.nextcurrent = current.nextcurrent.next = left if left else rightreturn dummy.next# 获取链表中点,将链表分为两部分mid = getMiddle(head)left = headright = mid.nextmid.next = None# 递归地对左右两部分链表进行排序left_sorted = sortList(left)right_sorted = sortList(right)# 合并两个已排序的链表return merge(left_sorted, right_sorted)

34、合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[1->4->5,1->3->4,2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i]升序 排列
  • lists[i].length 的总和不超过 10^4

思路解答:

  1. 初始化一个优先队列(heap):首先,创建一个空的优先队列(heap),用于存储链表的头部节点。将每个链表的头部节点(值和节点本身的元组)加入到优先队列中,并根据节点的值进行排序。
  2. 创建一个虚拟头节点和当前节点:创建一个虚拟头节点dummy和一个指向当前节点的指针curr,初始时它们都指向虚拟头节点。
  3. 循环处理优先队列:在一个循环中,不断从优先队列中弹出最小的节点。将该节点接入到合并后的链表中,更新当前节点指针curr。如果被弹出的节点有下一个节点,则将下一个节点(值和节点本身的元组)重新加入到优先队列中。
  4. 返回合并后的链表:最终,返回虚拟头节点的下一个节点,即为合并后的链表的头节点。
def mergeKLists(self, lists: list[Optional[ListNode]]) -> Optional[ListNode]:setattr(ListNode, "__lt__", lambda a, b: a.val < b.val)heap = []for l in lists:if l:heapq.heappush(heap, (l.val, l))  # 将节点的值和节点本身存入堆中dummy = ListNode(0)current = dummywhile heap:val, node = heapq.heappop(heap)  # 从堆中取出节点的值和节点本身current.next = nodecurrent = current.nextif node.next:heapq.heappush(heap, (node.next.val, node.next))  # 将下一个节点的值和节点本身存入堆中return dummy.next

35、LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity)正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 getput 必须以 O(1) 的平均时间复杂度运行。

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4

提示:

  • 1 <= capacity <= 3000
  • 0 <= key <= 10000
  • 0 <= value <= 105
  • 最多调用 2 * 105getput

思路解答:

  1. 使用一个哈希表(dictionary)来存储key和对应的节点。
  2. 使用一个双向链表来维护节点的访问顺序,链表头部表示最久未使用的节点,链表尾部表示最近访问的节点。
  3. LRUCache类中包含getput方法:
    • get(key)方法:
      • 如果key存在于缓存中,从哈希表中获取对应的节点,并将该节点移动到链表尾部表示最近访问。
      • 如果key不存在于缓存中,返回-1。
    • put(key, value)方法:
      • 如果key已存在于缓存中,更新对应节点的值,并将其移动到链表尾部表示最近访问。
      • 如果key不存在于缓存中:
        • 创建一个新节点,插入到链表尾部表示最近访问。
        • 将key和对应节点存入哈希表。
        • 如果插入操作导致缓存容量超过限制,移除链表头部节点,同时从哈希表中删除对应的键值对。
class ListNode:def __init__(self, key=0, val=0):self.key = keyself.val = valself.prev = Noneself.next = Noneclass LRUCache:def __init__(self, capacity):self.capacity = capacityself.cache = {}self.head = ListNode()self.tail = ListNode()self.head.next = self.tailself.tail.prev = self.headdef get(self, key):if key in self.cache:node = self.cache[key]self._remove(node)self._add(node)return node.valreturn -1def put(self, key, value):if key in self.cache:self._remove(self.cache[key])node = ListNode(key, value)self.cache[key] = nodeself._add(node)if len(self.cache) > self.capacity:node_to_remove = self.head.nextself._remove(node_to_remove)del self.cache[node_to_remove.key]def _add(self, node):prev_node = self.tail.prevprev_node.next = nodenode.prev = prev_nodenode.next = self.tailself.tail.prev = nodedef _remove(self, node):prev_node = node.prevnext_node = node.nextprev_node.next = next_nodenext_node.prev = prev_node

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小(2)型土石坝安全监测设施配置详解

小(2)型土石坝的安全监测是确保大坝稳定、安全运行的重要环节。为此&#xff0c;合理配置安全监测设施显得尤为重要。以下是对小(2)型土石坝安全监测设施配置的详细介绍。 一、渗流量监测 渗流量是反映大坝安全状况的关键指标之一。为准确监测渗流量&#xff0c;我们采用仪器量…

解释一下前端框架中的虚拟DOM(virtual DOM)和实际DOM(real DOM)之间的关系。

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Google大模型Bard更名Gemini,现在实力如何?(VS gpt系列)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍1、Gemini是什么&#xff1f;2、主要特点3、Gemini的版本4、应用潜力5、…

部署若依前后端分离项目,连接数据库失败

部署若依前后端分离项目&#xff0c;连接数据库失败&#xff0c;异常如下&#xff1a; 解决方案&#xff1a;application配置文件里&#xff0c;连接数据库的参数useSSL的值改为false

android Service 与 activity 通信 并不断传数据

注&#xff1a;这只是个Demo 以下载为案例&#xff0c;实现开启下载&#xff0c;暂停下载&#xff0c;下载进度不断发送给activity class DownloadService : Service() {override fun onBind(intent: Intent?): IBinder? {return MyBinder()}inner class MyBinder : Binder…

机器学习|决策树

左图的点是一种线性不可分的情况&#xff0c;无法拿一条直线去将进行分开。 每一个节点都代表一个决策&#xff0c;从而导致节点的分流。 最终的目标肯定是要达到分类。 但取得目标的过程是有所谓的好坏。 而这个好坏用熵/信息增益来衡量。 熵是一种用于反映系统混乱程度的物理…

ES系列之Logstash实战入门

概述 作为ELK技术栈一员&#xff0c;Logstash用于将数据采集到ES&#xff0c;通过简单配置就能把各种外部数据采集到索引中进行保存&#xff0c;可提高数据采集的效率。 原理 数据源提供的数据进入Logstash的管道后需要经过3个阶段&#xff1a; input&#xff1a;负责抽取数…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

layui中,父页面与子页面,函数方法的相互调用、传参

<%--父页面--%> <script type"text/javascript">var KaoHaoType 0; // 考号类型 自定义参数1// 选取考号类型function SelectKaoHaoType(callBack) {KaoHaoType 0; // 默认选择填涂考号layer.open({type: 2, title: 请选择 考号区类型, ar…

Day05:反弹SHELL不回显带外正反向连接防火墙出入站文件下载

目录 常规基本渗透命令 文件上传下载-解决无图形化&解决数据传输 反弹Shell命令-解决数据回显&解决数据通讯 防火墙绕过-正向连接&反向连接&内网服务器 防火墙组合数据不回显-ICMP带外查询Dnslog 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;W…

二维码样式美化怎么做?二维码改颜色、样式的方法

随着现在二维码广泛使用&#xff0c;面对不同的使用需求二维码展示的内容不同外&#xff0c;还需要对二维码的样式做处理&#xff0c;常见的设置有颜色修改、添加logo、编辑文字、样式调整等。那么&#xff0c;在遇到二维码样式修改问题时&#xff0c;为了能够更快的解决样式修…

IDC 中搭建 Serverless 应用平台:通过 ACK One 和 Knative 玩转云资源

作者&#xff1a;元毅、庄宇 如何打造云上&#xff08;公共云&#xff09;、云下&#xff08;IDC 数据中心&#xff09;统一的云原生 Serverless 应用平台&#xff0c;首先我们来看一下 ChatGPT 4 会给出什么样的答案&#xff1a; 如何打造云上、云下统一的云原生 Serverless…