力扣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 head

    def getMiddle(head):
        slow = head
        fast = head

        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next

        return slow

    def merge(left, right):
        dummy = ListNode(0)
        current = dummy

        while left and right:
            if left.val < right.val:
                current.next = left
                left = left.next
            else:
                current.next = right
                right = right.next
            current = current.next

        current.next = left if left else right

        return dummy.next

    # 获取链表中点,将链表分为两部分
    mid = getMiddle(head)
    left = head
    right = mid.next
    mid.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 = dummy

    while heap:
        val, node = heapq.heappop(heap)  # 从堆中取出节点的值和节点本身
        current.next = node
        current = current.next
        if 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 = key
        self.val = val
        self.prev = None
        self.next = None


class LRUCache:
    def __init__(self, capacity):
        self.capacity = capacity
        self.cache = {}
        self.head = ListNode()
        self.tail = ListNode()
        self.head.next = self.tail
        self.tail.prev = self.head

    def get(self, key):
        if key in self.cache:
            node = self.cache[key]
            self._remove(node)
            self._add(node)
            return node.val
        return -1

    def put(self, key, value):
        if key in self.cache:
            self._remove(self.cache[key])
        node = ListNode(key, value)
        self.cache[key] = node
        self._add(node)

        if len(self.cache) > self.capacity:
            node_to_remove = self.head.next
            self._remove(node_to_remove)
            del self.cache[node_to_remove.key]

    def _add(self, node):
        prev_node = self.tail.prev
        prev_node.next = node
        node.prev = prev_node
        node.next = self.tail
        self.tail.prev = node

    def _remove(self, node):
        prev_node = node.prev
        next_node = node.next
        prev_node.next = next_node
        next_node.prev = prev_node

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

紫光展锐T618_4G安卓核心板方案定制

紫光展锐T618核心板是一款采用纯国产化方案的高性能产品&#xff0c;搭载了开放的智能Android操作系统&#xff0c;并集成了4G网络&#xff0c;支持2.5G5G双频WIFI、蓝牙近距离无线传输技术以及GNSS无线定位技术。 展锐T618核心板应用旗舰级 DynamlQ架构 12nm 制程工艺&#x…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…

LeetCode 刷题 [C++] 第108题.将有序数组转换为二叉搜索树

题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 题目分析 由于二叉搜索树的中序遍历是升序的&…

STM32(16)使用串口向电脑发送数据

发送字节 发送数组 发送字符和字符串 字符&#xff1a; 字符串&#xff1a; 字符串在电脑中以字符数组的形式存储

Android APK包反编译为java文件教程

方法 流程&#xff1a; test.apk -> smali文件 -> dex文件 -> jar文件 ->java 文件 将APK包解压为 smail文件 下载 apktool工具 apktool.jar 将 test.apk 和 apktool.jar放同一目录下&#xff0c;并执行以下命令 java -jar apktool.jar d -f xxx.apk -o xxx(解…

Linux-信号3_sigaction、volatile与SIGCHLD

文章目录 前言一、sigaction__sighandler_t sa_handler;__sigset_t sa_mask; 二、volatile关键字三、SIGCHLD方法一方法二 前言 本章内容主要对之前的内容做一些补充。 一、sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struc…

“比特币暴拉冲破6.5万美元”!超罕见指标揭示牛市信号,18万美元目标能否实现?

比特币&#xff08;BTC&#xff09;周末持续在6.2万美元反复震荡之后&#xff0c;今&#xff08;4&#xff09;晨再次强势拉涨&#xff0c;早上8&#xff1a;45左右最高触及64268美元&#xff0c;随后插针盘整&#xff0c;下午5点30分左右突破65500美元&#xff0c;再创今年新高…

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置&#xff0c;原文21年已经有些许不同。 下载tomcat 官网&#xff1a;http://tomcat.apache.org/ 我们老师让安装8.5以上&#xff0c;所以我直接选择版本9 点击9页面之后…

YOLOv5-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

[Redis]——RedisTemplate的两种序列化方式

目录 1. RedisTemplate 2. StringRedisTemplate 方案一&#xff1a; 自定义RedisTemplate修改RedisTemplate的序列化器写入数据时自动序列化 方案二&#xff1a; 使用StringRedisTemplate手动序列化手动反序列化 1. RedisTemplate 编写的java代码 Testvoid contextLoads2…

Redis 淘汰策略、持久化、高可用

淘汰策略 只有 redis 内存空间已满并且往里面写新数据&#xff0c;才会触发淘汰策略。通过 expire / / /pexpire 让 key-value 过期&#xff0c;从而让 redis 清除这个 key-value。value 的数据结构typedef struct redisObject {unsigned tpye:4;unsigned encoding:4;// 判断哪…

10个软件测试的吐槽点!

问题一&#xff1a;测试时间评估 这是一个工作日常经常需要回复的问题&#xff0c;理论上&#xff0c;测试这边要做出较科学合理的回复&#xff0c;那就要将【需求变更】、【开发进度延误】、【bug 修复不稳定】、【复杂业务流程】、【测试环境不稳定】、【上下游服务依赖】、…

LaTeX文档中文显示错误解决办法

LaTeX文档中文显示错误解决办法 如果在LaTeX文档中遇到中文显示错误&#xff0c;通常是因为文档没有正确配置以支持中文。解决这个问题的一个常见方法是使用XeLaTeX引擎编译文档&#xff0c;它天然支持UTF-8编码&#xff0c;可以很好地处理中文。同时&#xff0c;使用ctex宏包…

Vue3中使用ffmpeg.wasm进行转码

一、安装方法 1.1 使用yarn进行安装 yarn add ffmpeg/ffmpeg ffmpeg/core1.2 安装版本 注意安装版本需在0.12.0以上版本才可以使用下面代码&#xff08;目前更新到0.12.10&#xff09;&#xff0c;之前的版本代码使用方法有所不同&#xff08;0.12.10之后的版本也可能会有变动…

链表相加(二)

题目 题目链接 链表相加(二)_牛客题霸_牛客网 题目描述 代码实现 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param head1 ListNode类 * param head2 ListNode类 * return ListNode…

4G/5G执法记录仪、智能安全帽走国标GB28181接入海康、宇视等大平台,也可走平台与平台对接,以下级平台级联到上级大平台

AIoT万物智联&#xff0c;智能安全帽生产厂家&#xff0c;执法记录仪生产厂家&#xff0c;智能安全帽、智能头盔、头盔记录仪、执法记录仪、智能视频分析/边缘计算AI盒子、车载DVR/NVR、布控球、智能眼镜、智能手电、无人机4G补传系统等统一接入大型融合通信可视指挥调度平台VM…

【算法分析与设计】被围绕的区域

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有…

告别手动填写邀请码,这款App数据统计工具帮你轻松实现

在移动互联网时代&#xff0c;App的推广和运营已成为各大企业的必修课。然而&#xff0c;面对错综复杂的推广渠道和浩如烟海的数据&#xff0c;如何精准地追踪用户来源、优化推广策略&#xff0c;一直是困扰着运营者的难题。今天&#xff0c;我们就来聊聊一款能够帮助你轻松解决…

『Linux从入门到精通』第 ㉓ 期 - 管道

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;进程间通信的目的&#x1f427;如何进行进程间通信&#x1f427;进程间通信的分类&#x1f427;管道&#x1f426;什么是管道&#x1f426;管道原理 &#x1f427;实例代码&#x1f427;管道的特点&#x1f4…

如何扫码查看图片信息?图片放到二维码展示的在线教学

现在通过扫码来查看物品图片是很常用的一种方式&#xff0c;将物品不同角度的图片存入一张二维码后&#xff0c;用户只需要扫描这张二维码图片&#xff0c;就可以了解物品预览图及其他信息。常用的图片格式比如jpg、png、gif都可以放到二维码中显示&#xff0c;那么具体该怎么做…