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

LeetCode 热题 100 | 链表(下)

目录

1  148. 排序链表

2  23. 合并 K 个升序链表

3  146. LRU 缓存

3.1  解题思路

3.2  详细过程

3.3  完整代码


菜鸟做题第三周,语言是 C++

1  148. 排序链表

解题思路:

  1. 遍历链表,把每个节点的 val 都存入数组中
  2. 用 sort 函数对数组进行排序
  3. 遍历链表,更新每个节点的 val
class Solution {
public:ListNode* sortList(ListNode* head) {ListNode * p = head;vector<int> vals;while (p) {vals.push_back(p->val);p = p->next;}sort(vals.begin(), vals.end());p = head;int i = 0;while (p) {p->val = vals[i];p = p->next;++i;}return head;}
};

2  23. 合并 K 个升序链表

解题思路:

  1. 遍历所有链表,把每个节点的 val 都存入数组中
  2. 用 sort 函数对数组进行排序
  3. 构造新的链表,并放入数组中的值
class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {vector<int> vals;int n = lists.size();if (n == 0) return nullptr;for (int i = 0; i < n; ++i) {ListNode * p = lists[i];while (p) {vals.push_back(p->val);p = p->next;}}sort(vals.begin(), vals.end());ListNode * dummy = new ListNode(0);ListNode * p = dummy;for (auto &val:vals) {ListNode * t = new ListNode(val);p->next = t;p = t;}return dummy->next;}
};

3  146. LRU 缓存

3.1  解题思路
  • 构造双向链表,用于表示某节点最近是否被使用
  • 构造哈希表,用于快速定位节点位置

Q:如何表示某节点最近是否被访问?

A:在我的解法中,将最近被使用的节点链在链表尾部。由此,越靠近头部的节点越少被使用。

Q:什么叫被使用?

A:被使用包含两种:最新被插入到链表中的节点、最新被访问的节点。

Q:为什么一定要构造双向链表?

A:哈希表中存储的是节点的地址,帮助我们快速定位。但是定位只能定位到节点本身,而不能定位到节点的前一个节点,因此使用单向链表将无法完成节点的删除。

3.2  详细过程

① 定义双向链表结构体

struct DListNode {int key, value;DListNode * prev, * next;DListNode() : key(0), value(0), prev(nullptr), next(nullptr) {}DListNode(int x, int y) : key(x), value(y), prev(nullptr), next(nullptr) {}
};

照抄力扣定义的结构体即可,只不过多了一个 prev 前向指针。

② 定义变量

int cap = 0, size = 0;
unordered_map<int, DListNode *> hashtable;
DListNode * head, * tail;
  • cap 表示缓存的容量,size 表示缓存目前被占用的量
  • hashtable 的键是节点的 key,值是节点的地址 DListNode *
  • head 和 tail 是虚拟节点,辅助节点的插入和删除

③ 定义函数

void addToTail(int key, int value) {DListNode * node = new DListNode(key, value);hashtable[key] = node;node->next = tail;node->prev = tail->prev;tail->prev->next = node;tail->prev = node;++size;
}void moveToTail(int key) {DListNode * node = hashtable[key];node->prev->next = node->next;node->next->prev = node->prev;--size;addToTail(key, hashtable[key]->value);
}void delHeadNode() {DListNode * node = head->next;node->next->prev = head;head->next = node->next;delete node;
}
  • addToTail:是指在链尾插入新的节点
  • moveToTail:是指将最近使用到的节点删除,再插入到链尾
  • delHeadNode:是指缓存空间不够时,删除头节点

由于在我的解法中 “越靠近头部的节点越少被使用”,所以每次被替换掉的是头节点。

3.3  完整代码
class LRUCache {
public:struct DListNode {int key, value;DListNode * prev, * next;DListNode() : key(0), value(0), prev(nullptr), next(nullptr) {}DListNode(int x, int y) : key(x), value(y), prev(nullptr), next(nullptr) {}};int cap = 0, size = 0;unordered_map<int, DListNode *> hashtable;DListNode * head, * tail;LRUCache(int capacity) {cap = capacity;head = new DListNode();tail = new DListNode();head->next = tail;tail->prev = head;}int get(int key) {if (hashtable.count(key)) {moveToTail(key);return hashtable[key]->value;}return -1;}void put(int key, int value) {if (hashtable.count(key)) {hashtable[key]->value = value;moveToTail(key);} else if (!hashtable.count(key)) {if (size < cap) {addToTail(key, value);} else if (size >= cap) {hashtable.erase(head->next->key);delHeadNode();addToTail(key, value);}}}void addToTail(int key, int value) {DListNode * node = new DListNode(key, value);hashtable[key] = node;node->next = tail;node->prev = tail->prev;tail->prev->next = node;tail->prev = node;++size;}void moveToTail(int key) {DListNode * node = hashtable[key];node->prev->next = node->next;node->next->prev = node->prev;--size;addToTail(key, hashtable[key]->value);}void delHeadNode() {DListNode * node = head->next;node->next->prev = head;head->next = node->next;delete node;}
};

相关文章:

LeetCode 热题 100 | 链表(下)

目录 1 148. 排序链表 2 23. 合并 K 个升序链表 3 146. LRU 缓存 3.1 解题思路 3.2 详细过程 3.3 完整代码 菜鸟做题第三周&#xff0c;语言是 C 1 148. 排序链表 解题思路&#xff1a; 遍历链表&#xff0c;把每个节点的 val 都存入数组中用 sort 函数对数组进…...

Ubuntu搭建计算集群

计算机硬件和技术的发展使得高性能模拟和计算在生活和工作中的作用逐渐显现出来&#xff0c;无论是计算化学&#xff0c;计算物理和当下的人工智能都离不开高性能计算。笔者工作主要围绕计算化学和物理开展&#xff0c;亦受限于自身知识和技术所限&#xff0c;文中只是浅显地尝…...

数据结构~~树(2024/2/8)

目录 树 1、定义&#xff1a; 2、树的基本术语&#xff1a; 3、树的表示 树 1、定义&#xff1a; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&…...

【教学类-48-03】202402011“闰年”(每4年一次 2月有29日)世纪年必须整除400才是闰年)

2000-2099年之间的闰年有25次&#xff0c; 背景需求&#xff1a; 已经制作了对称年月的数字提取&#xff0c;和年月日相等的年份提取 【教学类-48-01】20240205对称的“年”和“月日”&#xff08;如2030 0302&#xff09;-CSDN博客文章浏览阅读84次。【教学类-48-01】202402…...

如何开发一个属于自己的人工智能语言大模型?

要开发一个属于自己的人工智能语言模型&#xff0c;你需要遵循以下步骤&#xff1a; 数据收集&#xff1a;首先你需要大量的文本数据来训练你的模型。这些数据可以来自于各种来源&#xff0c;例如书籍、网站、新闻文章等。你需要确保这些数据足够多样化&#xff0c;以便模型能学…...

【HTTP】localhost和127.0.0.1的区别是什么?

目录 localhost是什么呢&#xff1f; 从域名到程序 localhost和127.0.0.1的区别是什么&#xff1f; 域名的等级划分 多网站共用一个IP和端口 私有IP地址 IPv6 今天在网上逛的时候看到一个问题&#xff0c;没想到大家讨论的很热烈&#xff0c;就是标题中这个&#xff1a; …...

Edge浏览器-常用快捷键

按键组合作用Ctrl Shift I开发人员工具Ctrl E定位到 空地址栏Ctrl L定位到 地址栏Ctrl Shift B显示或隐藏 收藏夹栏Ctrl Shift O打开收藏夹(搜索)Ctrl T打开一个新标签页Ctrl W关闭当前标签页Ctrl Shift T重新打开刚才关闭的标签页Ctrl Tab切换到下一个标签页Ctrl…...

C++:Vector动态数组的copy深入理解

动态数组分配的大小默认为2的n次方1&#xff0c;2&#xff0c;4&#xff0c;8... 在main中创建的vertices&#xff0c;push需要放到Vertex中&#xff08;copy&#xff09;&#xff0c;下一次copy是因为要调整vertices的大小 vertices.push_back(Vertex(1,2,3));//拷贝 第一次&a…...

【PyTorch】PyTorch中张量(Tensor)切片操作

PyTorch深度学习总结 第三章 PyTorch中张量(Tensor)切片操作 文章目录 PyTorch深度学习总结一、前言二、获取张量中的元素1、切片&#xff08;行、列数&#xff09;方法2、torch.where()函数3、使元素置零的操作 一、前言 上文介绍了PyTorch中改变张量(Tensor)形状的操作&…...

GeoServer 2.11.1升级解决Eclipse Jetty 的一系列安全漏洞问题

Eclipse Jetty 资源管理错误漏洞(CVE-2021-28165) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7656) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7657) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7658) Jetty 信息泄露漏洞(CVE-2017-9735) Eclipse Jetty 安全漏洞(CVE-2022-20…...

【蓝桥杯选拔赛真题34】C++最大值 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++最大值 一、题目要求 1、编程实现 2、输入输出...

STM32之USART

概述 串口通信&#xff0c;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter &#xff09;&#xff0c;简称UART&#xff1b;而USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步收发传输器。 USAR…...

unity 点击事件

目录 点击按钮&#xff0c;显示图片功能教程 第1步添加ui button&#xff0c;添加ui RawImage 第2步 添加脚本&#xff1a; 第3步&#xff0c;把脚本拖拽到button&#xff0c;点击button&#xff0c;设置脚本的变量&#xff0c; GameObject添加 Component组件 点击按钮&am…...

idea自带的HttpClient使用

1. 全局变量配置 {"local":{"baseUrl": "http://localhost:9001/"},"test": {"baseUrl": "http://localhost:9002/"} }2. 登录并将结果设置到全局变量 PostMapping("/login")public JSONObject login(H…...

vue3-应用规模化-路由和状态

客户端 vs. 服务端路由 服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果。当我们在一个传统的服务端渲染的 web 应用中点击一个链接时&#xff0c;浏览器会从服务端获得全新的 HTML&#xff0c;然后重新加载整个页面。 然而&#xff0c;在单页面应用中&…...

网络安全检查表

《网络攻击检查表》 1.应用安全漏洞 2.弱口令&#xff0c;默认口令 3.服务器互联网暴露 4.操作系统&#xff0c;中间件安全漏洞 5.研发服务器&#xff0c;邮件服务器等安全检查...

SSM框架,Maven的学习(下)

依赖传递和依赖冲突 依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B&#xff0c;而 B 又依赖于模块或库 C&#xff0c;那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时&#xff0c;构建工具&#xff08;如 Maven、Gradle&…...

Vivado开发FPGA使用流程、教程 verilog(建立工程、编译文件到最终烧录的全流程)

目录 一、概述 二、工程创建 三、添加设计文件并编译 四、线上仿真 五、布局布线 六、生成比特流文件 七、烧录 一、概述 vivado开发FPGA流程分为创建工程、添加设计文件、编译、线上仿真、布局布线&#xff08;添加约束文件&#xff09;、生成比特流文件、烧录等步骤&a…...

C语言之动态内存管理

目录 1. 为什么要有动态内存分配2. malloc和freemallocfree 3. calloc和realloccallocrealloc 4. 常见的动态内存的错误对NULL直接的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存…...

【AIGC风格prompt深度指南】掌握绘画风格关键词,实现艺术模仿的革新实践

[小提琴家]ASCII风格&#xff0c;点&#xff0c;爆炸&#xff0c;光&#xff0c;射线&#xff0c;计算机代码 由冰和水制成的和平标志]非常详细&#xff0c;寒冷&#xff0c;冰冻&#xff0c;大气&#xff0c;照片逼真&#xff0c;流动&#xff0c;16K 胡迪尼模拟火和水&#x…...

Qt安装配置教程windows版(包括:Qt5.8.0版本,Qt5.12,Qt5.14版本下载安装教程)(亲测可行)

目录 Qt5.8.0版本安装教程Qt5.8.0版本下载安装 Qt5.12.2版本安装教程下载安装 Qt 5.14.2安装教程下载安装和创建项目 参考视频 QT为嵌入式系统提供了大量的库和可重用组件。 WPS Office&#xff0c;咪咕音乐&#xff0c;Linux桌面环境等都是QT开发的。 Qt5.8.0版本安装教程 Q…...

SpringCloud-Ribbon实现负载均衡

在微服务架构中&#xff0c;负载均衡是一项关键的技术&#xff0c;它可以确保各个服务节点间的负载分布均匀&#xff0c;提高整个系统的稳定性和性能。Spring Cloud 中的 Ribbon 就是一种负载均衡的解决方案&#xff0c;本文将深入探讨 Ribbon 的原理和在微服务中的应用。 一、…...

Qt网络编程-TCP与UDP

网络基础 TCP与UDP基础 关于TCP与UDP的基础这里就不过多介绍了&#xff0c;具体可以查看对应百度百科介绍&#xff1a; TCP&#xff08;传输控制协议&#xff09;_百度百科 (baidu.com) UDP_百度百科 (baidu.com) 需要知道这两者的区别&#xff1a; 可靠性&#xff1a; TC…...

Promise 常见题目

微信搜索“好朋友乐平”关注公众号。 1. Promise 对象池 请你编写一个异步函数 promisePool &#xff0c;它接收一个异步函数数组 functions 和 池限制 n。它应该返回一个 promise 对象&#xff0c;当所有输入函数都执行完毕后&#xff0c;promise 对象就执行完毕。 池限制 定…...

五大架构风格之五:仓库架构风格

仓库架构风格&#xff1a; 仓库风格架构&#xff08;Repository Architecture Style&#xff09;是一种软件架构模式&#xff0c;它主要用于处理系统中的持久化数据存储和检索。在这一风格中&#xff0c;仓库&#xff08;Repository&#xff09;作为应用程序与数据库或其他持久…...

探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 引言&#xff1a;探索简化之路 一、起源和演变 二、场景案例分析 2.1 不用模式实现&#xff1a;用一坨坨代码实现 2.2 问题 2.3 外观模式重构代码 定义 界面 接口 利用外观模式解决问题步骤 外观模式结构和说明 重构…...

java之Maven

1. maven Maven是管理和构建java项目的工具 项目依赖资源(jar包)的管理,避免版本冲突统一项目结构项目构建&#xff0c;标准跨平台(Linux,window,MacOS)的自动化项目管理 2.maven依赖仓库 2.maven安装 maven安装视频教程 3. IDEA集成Maven 4. maven的依赖范围 5. maven生命…...

Elasticsearch(四)

是这样的前面的几篇笔记&#xff0c;感觉对我没有形成知识体系&#xff0c;感觉乱糟糟的&#xff0c;只是大概的了解了一些基础知识&#xff0c;仅此而已&#xff0c;而且对于这技术栈的学习也是为了在后面的java开发使用&#xff0c;但是这里的API学的感觉有点乱&#xff01;然…...

蓝桥杯-X图形

问题描述 给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个 45度斜线方向引出的直线段组成&#xff0c;四条线段的长度相同&#xff0c;而且四条线段上的字母和中心点的字母相同。 一个 X 图形可以使用三个整数 r,c,L 来描述&#xff0c;其中 r,c 表示中心点位于第 r 行…...

2. Maven 继承与聚合

目录 2. 2.1 继承 2.2继承关系 2.2.1 思路分析 2.2.2 实现 2.1.2 版本锁定 2.1.2.1 场景 2.1.2.2 介绍 2.1.2.3 实现 2.1.2.4 属性配置 2.2 聚合 2.2.1 介绍 2.2.2 实现 2.3 继承与聚合对比 maven1&#xff1a;分模块设计开发 2. 在项目分模块开发之后啊&#x…...

如何把手机平板变为电脑的屏幕

文章目录 安装软件运行效果结尾 本文首发地址 https://h89.cn/archives/181.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 闲置的手机平板、触屏音箱等&#xff0c;均可作为电脑的扩展屏&#xff0c;为电脑增加一块显示屏&#xff0c;本文介绍如何使用免费的软件s…...

Amazon Dynamo学习总结

目录 一、Amazon Dynamo的问世 二、Amazon Dynamo主要技术概要 三、数据划分算法 四、数据复制 五、版本控制 六、故障处理 七、成员和故障检测 一、Amazon Dynamo的问世 Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统&#xff0c;旨在解…...

appium抓包总结

appium抓包总结 背景&#xff1a;有些app通过抓包工具charles等抓不到接口数据&#xff0c;应为这一类抓包工具只能抓到应用层的数据包&#xff0c;而某些app的接口是走的传输层协议&#xff0c;所以此时只能通过AppIUM工具来进行抓包。 1、Appium 是什么&#xff1f; Appium…...

arcgis各种版本下载

arcgic 下载&#xff01;&#xff01;&#xff01; ArcGIS是一款地理信息系统软件&#xff0c;由美国Esri公司开发。它提供了一系列完整的GIS功能&#xff0c;包括地图制作、空间数据管理、空间分析、空间信息整合、发布与共享等。ArcGIS是一个可扩展的GIS平台&#xff0c;提供…...

第五篇:MySQL常见数据类型

MySQL中的数据类型有很多&#xff0c;主要分为三类:数值类型、字符串类型、日期时间类型 三个表格都在此网盘中&#xff0c;需要者可移步自取&#xff0c;如果觉得有帮助希望点个赞~ MySQL常见数据类型表 数值类型 &#xff08;注&#xff1a;decimal类型举例&#xff0c;如1…...

Oracle用BETWEEN AND查某年的数据可能会丢失条数

随便找一张有日期&#xff08;字段类型为DATE&#xff09;的表即可测试。 假设存在这样一张表HOLIDAY&#xff0c;里面存储的是某些国家(表字段为COUNTRY_CODE)某些年的法定假日日期(表字段为HOLIDAY_DATE)。 我想查中国在2023年和2024年的法定假日日期。 BETWEEN AND 首先想…...

Nuscenes数据集点云数据如何转换到图像上

零、概要 注意&#xff1a;该文章是手写ai自动驾驶&#xff0c;Nuscenes数据集的笔记。 首先&#xff0c;学习需要使用到 nuScenes 数据集。python 工具需要使用到 nuscenes-devkit、pyquaternion from nuscenes.nuscenes import NuScenes from pyquaternion import Quatern…...

【C语言期末】商品管理系统

本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括&#xff1a;包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求&#xff1a;1、信息首先保存在文件中&#xff0c;然后打开文件进行…...

单片机学习笔记---串口通信(2)

目录 串口内部结构 串口相关寄存器 串口控制寄存器SCON SM0和SM1 SM2 REN TB8和RB8 TI和RI 电源控制寄存器PCON SMOD 串口工作方式 方式0 方式0输出&#xff1a; 方式0输入 方式1 方式1输出。 方式1输入 方式2和方式3 方式2和方式3输出&#xff1a; 方式2和…...

【Java】乐观锁有哪些常见实现方式?

Java中的乐观锁主要有两种常见的实现方式&#xff1a; CAS&#xff08;Compare and Swap&#xff09;&#xff1a;这是实现乐观锁的核心算法。CAS操作包含三个参数&#xff1a;内存地址V、旧的预期值A和要修改的新值B。执行CAS操作时&#xff0c;会先比较内存地址V中的值是否等…...

Javaweb之SpringBootWeb案例之登录校验功能的详细解析

2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试&#xff0c;在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址&#xff1a;http://localhost:9528/#/system/dept&#xff0c;发现没有登录仍然可以进…...

CSS之盒模型

盒模型概念 浏览器盒模型&#xff08;Box Model&#xff09;是CSS中的基本概念&#xff0c;它描述了元素在布局过程中如何占据空间。盒模型由内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、和外边距&…...

博客系统-SpringBoot版本

相比于之前使用Servlet来完成的博客系统&#xff0c;SpringBoot版本的博客系统功能更完善&#xff0c;使用到的技术更接近企业级&#xff0c;快来看看吧~ 目录 1.项目介绍 2.数据库准备 3.实体化类 4.返回格式 5.登录和注册功能 6.登出&#xff08;注销&#xff09;功能…...

详细分析Redis中数值乱码的根本原因以及解决方式

目录 前言1. 问题所示2. 原理分析3. 拓展 前言 对于这方面的相关知识推荐阅读&#xff1a; Redis框架从入门到学精&#xff08;全&#xff09;Java关于RedisTemplate的使用分析 附代码java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; …...

网络专栏目录

大家好我是苏麟 , 这是网络专栏目录 . 图解网络 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 图解网络目录 基础篇 基础篇 TCP/IP网络模型有几层? : TCP/IP网络模型 键入网址到页面显示,期间发生了什么? : 键入网址到页面显示,期间发生了什么 现阶…...

【Python网络编程之Ping命令的实现】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之Ping命令的实现 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2…...

OpenHarmony轻量级驱动开发

OpenHarmony轻量级驱动开发 思维导图: https://download.csdn.net/download/lanlingxueyu/88817155 GPlO(General-purpose input/output)即通用型输入输出 描述 GPlO(General-purpose input/output)即通用型输入输出。通俗地说,GPlO口就是一些引脚可以通过它们输出高低…...

C语言如何输⼊字符数组?

一、问题 在程序中&#xff0c;scanf()函数可以输⼊任意类型的数据&#xff0c;gets()函数只能输⼊字符串等&#xff0c;但是如何更好地输⼊字符数组呢&#xff1f; 二、解答 我们知道如何使⽤格式输⼊函数 scanf()&#xff0c;那么可以使⽤%c 格式符逐个输⼊字符。这样输⼊有…...

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…...

鸿蒙开发理论之页面和自定义组件生命周期

1、自定义组件和页面的关系 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c;即页面的根节点&#xff0c;一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…...