LeetCode题解12 (146,97) LRU缓存<HashMap + 双向链表>,二叉树的中序遍历

news2024/11/18 7:48:18

文章目录

    • LRU缓存(146)
    • 完整代码解答:
    • 二叉树的中序遍历(94)
    • 完整代码解答:

LRU缓存(146)

在这里插入图片描述
从题上看存在Key和Value因此我们采用HashMap来进行存储,这里我们采用HashMap+双向链表来实现,我们需要实现里面的get,put方法。

我们需要先创建1个链表节点

//先定义一个节点类
class ListNode{
    //它是一个双向链表
    int key;
    int value;
    ListNode front;
    ListNode next;
    public ListNode(int key,int value){
        this.key = key;
        this.value = value;
    }
}

这里我们先实现put方法,根据题意:
1.首先我们应该判断当前的Map中是否存在一样的Key。
2.如果有了,我们就直接将原来的Value变成新的Value就行了,同时将这个节点放到首位。
3.如果没有,我们还要先判断HashMap的容量(capacity),如果超过了容量就删除最后一个节点,如果没有超过我们就把新的节点放到链表的末尾同时在HashMap添加。

public void put(int key, int value) {
        //先看该链表中有无当前的key,没有的话在添加之前要先确定容量
        if(!map.containsKey(key)){
            if(map.size() == capacity) {
            deletLastNode();
         }
            //先保存第一个节点即head的下一个节点
            ListNode temp = head.next;
            //先定义要新添加的节点
            ListNode newListNode = new ListNode(key,value);
            //head的下一个节点即为第一个节点,因为是双向链表因此需要2次连接
            head.next = newListNode;
            newListNode.front = head;
            //将temp连接到新的链表之后
            newListNode.next = temp;
            temp.front = newListNode;
            //再将新的节点加入map
            map.put(key,newListNode);
        }else{
            //如果map中有key的话,我们仅需要更改里面的value
              //先拿到对应key的节点
            ListNode list1 = map.get(key);
            list1.value = value;
            //因为我们做了1次修改,我们应该把修改的那个节点放在最前面
            putNodeFirst(list1);
        }
    }

同时这里面涉及到了将节点放到首位的方法: putNodeFirst()

实现:

这里如果不理解链表节点连接的建议画个双向链表来比对

//把当前的节点放到链表首位
    private void putNodeFirst(ListNode node){
        //这里建议画图好理解
        node.front.next = node.next;
        node.next.front = node.front;
        //记录第一个节点
        ListNode temp = head.next;
        head.next = node;
        node.front = head;
        node.next = temp;
        temp.front = node;
    }
}

删除最后一个节点的方法 : deletLastNode()

 //删除最后一个节点
    private void deletLastNode(){
        //先找到到最后一个节点即tail的上一个节点
        ListNode lastNode = tail.front;
        //然后我们将倒数第2个节点与tail连接那么倒数第二个节点就成了最后1个节点了
        lastNode.front.next = tail;
        tail.front = lastNode.front;
        //将最后lastNode从map中移除
        map.remove(lastNode.key);
    }

get方法的实现:
先判断map中是否存在对应的key值,没有的话返回-1,有的话返回对应的value,然后将对应的节点放到首位

 public int get(int key) {
        if(map.containsKey(key)){
            ListNode node1 = map.get(key);
            putNodeFirst(node1);
            return node1.value;
        }else{
            return -1;
        }
    }

完整代码解答:

//先定义一个节点类
class ListNode{
    //它是一个双向链表
    int key;
    int value;
    ListNode front;
    ListNode next;
    public ListNode(int key,int value){
        this.key = key;
        this.value = value;
    }
}
class LRUCache {
    int capacity;
    //Key是数字,值为链表
    Map<Integer,ListNode> map = new HashMap<>();
    //设置1个链表的头和尾
    ListNode head = new ListNode(0,0);
    ListNode tail = new ListNode(0,0);
    public LRUCache(int capacity) {
      this.capacity = capacity;
      //设置双向链表的连接 
        head.next = tail;
        tail.front = head;
    }
     // 思路:
     // 先判断map中是否存在对应的key值,没有的话返回-1,有的话返回对应的value,然后将对应的节点放到首位
    public int get(int key) {
        if(map.containsKey(key)){
            ListNode node1 = map.get(key);
            putNodeFirst(node1);
            return node1.value;
        }else{
            return -1;
        }
    }
    
    public void put(int key, int value) {
        //先看该链表中有无当前的key,没有的话在添加之前要先确定容量
        if(!map.containsKey(key)){
            if(map.size() == capacity) deletLastNode();
            //先保存第一个节点即head的下一个节点
            ListNode temp = head.next;
            //先定义要新添加的节点
            ListNode newListNode = new ListNode(key,value);
            //head的下一个节点即为第一个节点,因为是双向链表因此需要2次连接
            head.next = newListNode;
            newListNode.front = head;
            //将temp连接到新的链表之后
            newListNode.next = temp;
            temp.front = newListNode;
            //再将新的节点加入map
            map.put(key,newListNode);
        }else{
            //如果map中有key的话,我们仅需要更改里面的value
              //先拿到对应key的节点
            ListNode list1 = map.get(key);
            list1.value = value;
            //因为我们做了1次修改,我们应该把修改的那个节点放在最前面
            putNodeFirst(list1);
        }
    }
    //删除最后一个节点
    private void deletLastNode(){
        //先找到到最后一个节点即tail的上一个节点
        ListNode lastNode = tail.front;
        //然后我们将倒数第2个节点与tail连接那么倒数第二个节点就成了最后1个节点了
        lastNode.front.next = tail;
        tail.front = lastNode.front;
        //将最后lastNode从map中移除
        map.remove(lastNode.key);
    }
    //把当前的节点放到链表首位
    private void putNodeFirst(ListNode node){
        //这里建议画图好理解
        node.front.next = node.next;
        node.next.front = node.front;
        //记录第一个节点
        ListNode temp = head.next;
        head.next = node;
        node.front = head;
        node.next = temp;
        temp.front = node;
    }
}

二叉树的中序遍历(94)

在这里插入图片描述
这道题是简单题,同时也是树这个数据结构最基础的题,我们首先需要理解什么是中序遍历,(左,根,右),同时题上要求我们用一个数组来进行存储,因此我们需要定义一个数组。

扩展: 链接: (前序遍历 + 中序遍历 +后序遍历)

完整代码解答:

class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        if(root != null){
            //先左子节点
            inorderTraversal(root.left);
            //根节点
            list.add(root.val);
            inorderTraversal(root.right);
        }
        return list;
    }
}

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

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

相关文章

一个合格的程序员也是一名合格的侦探---Debug篇

调试 文章目录调试1.什么是bug&#xff1f;1.1bug概念1.2bug的起源2.什么是调试&#xff0c;调试的重要性2.1调式的概念2.2 调试的基本步骤2.3Debug版本和Release版本2.3.1Debug版本2.3.2Release版本2.3.3区别2.3.4同一代码在Debug和Release下的差别3.Windows下visual stdio的调…

ioDraw - 免费的在线图表制作工具

介绍&#xff1a; ioDraw是一款数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff0c;支持折线图、柱状图、饼图、散点图等 地址&#xff1a;https://www.iodraw.com/chart 特点&#xff1a; 图表…

springboot实现License证书的授权和许可到期验证

前言 在客户服务器部署软件项目后&#xff0c;为了项目版权管控或者对项目进行授权收费处理的&#xff0c;就需要实现项目的授权和许可验证。 在这里讲解的是使用 license证书 的形式实现授权和许可验证&#xff08;已通过测试&#xff09;。 主要是通过 IP地址、MAC地址、CP…

PyTorch - 线性回归

文章目录普通实现准备数据反向传播构建模型 实现实例化模型、损失函数、优化器训练数据评估模型普通实现 准备数据 import torch import matplotlib.pyplot as plt # 1、准备数据 # y 2 * x 0.8 x torch.rand([500, 1]) y_true 2 * x 0.8 # 2、通过模型计算 y_predict …

MyBatis面试题(2022最新版)

整理好的MyBatis面试题库&#xff0c;史上最全的MyBatis面试题&#xff0c;MyBatis面试宝典&#xff0c;特此分享给大家 MyBatis简介 MyBatis是什么&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它…

Kotlin 开发Android app(二十一):协程launch

什么是协程&#xff0c;这可是这几年才有的概念&#xff0c;我们也不用管它是什么概念&#xff0c;先看看他能做什么。 创建协程 添加依赖&#xff1a; implementation org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9implementation org.jetbrains.kotlinx:kotlinx-cor…

DCDC电感下方铜箔如何处理

挖&#xff1a;电感在工作时&#xff0c;其持续变化的电流产生的电磁波会或多或少的泄露出来&#xff0c;电感下方的铜箔受电磁波影响&#xff0c;就会有涡流出现&#xff0c;这个涡流&#xff0c;①可能对线路板上的信号线有干扰&#xff0c;②铜箔内的涡流会产生热量&#xf…

申请阿里云域名SSL证书步骤

1.【点击登录】 阿里云 2.选择 DV单域名证书 3.确定购买&#xff0c;支付。 4.完成后&#xff0c;跳转回控制台。 5.点击 证书申请。 6.填写域名、申请人姓名、手机号、邮箱、所在地 7、选择域名验证方式&#xff0c;官方提供了三种验证方式&#xff0c;根据自身情况选择其中…

【Linux】Linux的常见指令详解(下)

目录 前言 head/tail 命令行管道 date sort cal 搜索指令 find which whereis alias grep zip tar file bc history 热键 前言 之前讲了Linux的常见指令详解&#xff08;上&#xff09;&#xff0c;这次终于把下也补齐了。如果对你有帮助还麻烦给博主一个…

Netty_05_六种序列化方式(JavaIO序列化 XML序列化 Hessian序列化 JSON序列化 Protobuf序列化 AVRO序列化)(实践类)

文章目录一、普通的序列化方式(bean对象有直接的java类)1.1 普通的java io byteArray输入输出流的序列化方式1.2 xml序列化方式&#xff08;xml用来做配置文件&#xff0c;这样序列化出来长度很大&#xff09;1.3 Hessian序列化方式&#xff08;这个Dubbo中使用的序列化方式&am…

flask前后端项目--实例-前端部分:-3-vue基本配置

一、基本配置以及验证 1.基础环境&#xff1a;nodejs的安装配置以及注意事项 https://blog.csdn.net/wtt234/article/details/128131999 2.vue使用vite创建文件包的过程 创建项目 npm init vitelatest 根据提示一步步选择&#xff1a; 选择vue 进入项目目录&#xff0c;安装…

【计算机网络】网络层:IPV6

IPV4耗尽&#xff0c;使用具有更多地址空间的IPV6 IPV6特点&#xff1a; (1)IPV6地址128位&#xff0c;更大地址空间&#xff0c;可以划分位更多的层次 (2)IPV6定义许多拓展首部&#xff0c;可提供更多功能&#xff0c;但IPV6首部长度固定&#xff0c;选项放在有效载荷中 (…

打败阿根廷的究竟是谁

2022年卡塔尔世界杯正在如火如茶的进行着。在今年的世界杯中&#xff0c;有两个令人意外的点&#xff0c;一个是日本队击败的德国队&#xff0c;另外一点是沙特队战胜了实力强盛的阿根廷队。 有人说打败阿根廷队的不是沙特队&#xff0c;而是科技------"半自动越位"技…

某Y易盾滑块acToken、data逆向分析

内容仅供参考学习 欢迎朋友们V一起交流&#xff1a; zcxl7_7 目标 网址&#xff1a;案例地址 这个好像还没改版&#xff0c;我看官网体验那边已经进行了混淆 只研究了加密的生成&#xff0c;环境不正确可能会导致的加密结果对 (太累了&#xff0c;先缓缓吧&#xff0c;最近事比…

创建Mongo官方的免费数据库并使用VSCode连接

注册账号 https://cloud.mongodb.com/ 在这个平台注册账号&#xff0c;并登录 创建数据库 选择shared&#xff0c;其他要收费 导入样本数据 导入后会发现数据中多了很多sample数据&#xff0c;用于练习 创建访问用户 允许任何地址访问 如果需要任何IP地址都能访问&#xff…

Qt-数据库开发-用户登录、后台管理用户(6)

Qt-数据库开发-使用QSqlite数据库实现用户登录、后台管理用户功能 文章目录Qt-数据库开发-使用QSqlite数据库实现用户登录、后台管理用户功能1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;数据库开发 &…

UG环境设置

UG环境设置UG设置工作路径默认设置方法1&#xff1a; 修改快捷键路径方法2&#xff1a;修改“用户默认设置”UG设置窗口标题效果方法注意设置十字准线效果设置方法角色设置窗口布局效果方法命令搜索UG设置工作路径 默认设置 打开NX软件&#xff0c;新建模型默认路径如下&…

代码随想录算法训练营第三天| 链表理论基础, 203.移除链表元素,707.设计链表,206.反转链表

代码随想录算法训练营第三天| 链表理论基础&#xff0c; 203.移除链表元素&#xff0c;707.设计链表&#xff0c;206.反转链表 链表理论基础 建议&#xff1a;了解一下链接基础&#xff0c;以及链表和数组的区别 文章链接&#xff1a; 203.移除链表元素 建议&#xff1a; 本…

智源社区AI周刊No.109:ChatGPT预示大模型取代搜索引擎;Stable Diffusion2.1发布,8k高清图像生成...

汇聚每周AI热点&#xff0c;不错过重要资讯&#xff01;欢迎扫码&#xff0c;关注并订阅智源社区AI周刊。ChatGPT火出圈&#xff1a;对话大模型驱动新型搜索范式诞生&#xff0c;或将取代搜索引擎火出圈的ChatGPT注册用户数量已超过五百万&#xff0c;无疑是2022年最火的AI模型…

ReactNative MacOS环境初始化项目(安卓)

MacOS 12.6.1 官方文档 英文 https://reactnative.dev/docs/environment-setup中文 https://www.react-native.cn/docs/environment-setup 相关文档 ReactNative MacOS环境初始化项目(ios)OpenJDK 与 AdoptOpenJDK 的区别 安装步骤 安装Homebrew - /bin/zsh -c "$(curl -f…