一道经典题目,用双向链表去做能够满足O1的复杂度

核心代码如下

class LRUCache {
   MyLinkedList myLinkedList;
   int size;
   int capacity;
   HashMap<Integer, MyNode> map;
   public LRUCache(int capacity) {


       myLinkedList=new MyLinkedList();
       this.capacity=capacity;
       size=0;
       map=new HashMap<>();
  }

   public int get(int key) {

       if (!map.containsKey(key)){
           return -1;
      }
   //   拿出来 放到顶部

       MyNode current = map.get(key);

       myLinkedList.deleteAndAddFirst(current);

       return current.val;
  }

   public void put(int key, int value) {

       if (map.containsKey(key)){
       //   老人了

           MyNode current = map.get(key);
           current.val=value;
           myLinkedList.deleteAndAddFirst(current);
           map.put(key,current);
      }else {

           if (size<capacity){
           //   直接放进来就行
               MyNode temp = new MyNode(key, value);
               myLinkedList.add(temp);
               map.put(key,temp);
               size++;
          }else {
           //   踢人了

               MyNode myNode = myLinkedList.removeLast();
               map.remove(myNode.key);

           //   再放进
               MyNode temp = new MyNode(key, value);
               myLinkedList.add(temp);
               map.put(key,temp);
               

          }






      }




  }
}
class MyLinkedList{
   MyNode head;
   MyNode tail;

   public MyLinkedList() {
       head=new MyNode(-1,-1);
       tail=new MyNode(-1,-1);
       head.next=tail;
       tail.pre=head;
  }

   /**
    * 把之前的放到新的位置
    * @param current
    */
   public void deleteAndAddFirst(MyNode current){

       //去除之前的位置
       MyNode next = current.next;
       MyNode pre = current.pre;

       pre.next=next;
       next.pre=pre;
       add(current);

  }

   public void add(MyNode current){

       MyNode old = head.next;
       current.next=old;
       head.next=current;
       old.pre=current;
       current.pre=head;


  }
   public MyNode  removeLast(){

       MyNode last = tail.pre;
       MyNode pre= last.pre;

       pre.next=tail;
       tail.pre=pre;
       return last;
  }
}

class MyNode{

   Integer key;
   Integer val;
   MyNode next;
   MyNode pre;

   public MyNode(Integer key, Integer val) {
       this.key = key;
       this.val = val;
  }
}

题解

LRU 力扣 146 https://leetcode.cn/problems/lru-cache/的更多相关文章

  1. 力扣 - 146. LRU缓存机制

    目录 题目 思路 代码 复杂度分析 题目 146. LRU缓存机制 思路 利用双链表和HashMap来解题 看到链表题目,我们可以使用头尾结点可以更好进行链表操作和边界判断等 还需要使用size变量来 ...

  2. https://leetcode.com/problems/palindromic-substrings/description/

    https://www.cnblogs.com/grandyang/p/7404777.html 博客中写的<=2,实际上<=1也是可以的 相当于判断一个大指针内所有子字符串是否可能为回文 ...

  3. 力扣---1148. 文章浏览 I

    Views 表:+---------------+---------+| Column Name   | Type    |+---------------+---------+| article_i ...

  4. 力扣---2319. 判断矩阵是否是一个 X 矩阵

    如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 :    矩阵对角线上的所有元素都 不是 0    矩阵中所有其他元素都是 0给你一个大小为 n x n 的二维整数数组 grid ,表 ...

  5. 力扣---167. 两数之和 II - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数.如果设这两个数分别是 numbers[index1 ...

  6. 力扣---511. 游戏玩法分析 I

    活动表 Activity: +--------------+---------+| Column Name  | Type    |+--------------+---------+| player ...

  7. 力扣每日一题2023.1.19---2299. 强密码检验器 II

    如果一个密码满足以下所有条件,我们称它是一个 强 密码:    它有至少 8 个字符.    至少包含 一个小写英文 字母.    至少包含 一个大写英文 字母.    至少包含 一个数字 .    ...

  8. 力扣每日一题2023.1.16---1813. 句子相似性 III

    一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格.比方说,"Hello World" ,"HELLO" ,"hello w ...

  9. 力扣---45. 跳跃游戏 II

    给定一个长度为 n 的 0 索引整数数组 nums.初始位置为 nums[0].每个元素 nums[i] 表示从索引 i 向前跳转的最大长度.换句话说,如果你在 nums[i] 处,你可以跳转到任意 ...

  10. 力扣---213. 打家劫舍 II

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房 ...

随机推荐

  1. 打造自己的ChatGPT:OpenAI的API接入技巧

    打造自己的ChatGPT:OpenAI 的API接入技巧 2023年3月更新 OpenAI 在3月1日的时候放出了ChatGPT的接口,新的接口可以使用 GPT-3.5 模型,同时接口参数更新为了 m ...

  2. oracle数据对比--用户,索引,分区,dblink,同义词,视图

    问题描述:需要对比用户数据一般在数据库迁移之后,需要对比一下两个库之间的差距,如果登上去一条命令的执行,去统计,就会比较麻烦,这里整理了一些脚本可用.通过创建dblink的方式快速查询,也可以整合到一 ...

  3. 一天吃透JVM面试八股文

    什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...

  4. Shell脚本编程(二)

    Shell脚本编程(二) shell脚本编程中if.if else的使用以及一些常用到的操作符 if.if else使用方式:      1) if条件          if [ condition ...

  5. [C++核心编程] 4.6、继承

    文章目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员 ...

  6. vivo积分任务体系的架构演进-平台产品系列05

    作者:vivo 互联网平台产品研发团队- Mu JunFeng 积分体系作为一种常见营销工具,几乎是每一家企业会员营销的必备功能之一,在生活中随处可见,随着vivo互联网业务发展,vivo积分体系的能 ...

  7. 面试题:react、vue中的key

    1.虚拟DOM中key的作用     key是虚拟DOM对象的标识,当数据发生变化时,React/Vue会根据[新数据]生成新的[虚拟DOM],随后React/Vue进行[新虚拟DOM]与[旧虚拟DO ...

  8. 【Redis】Cluster集群

    一.Redis Cluster 工作原理 在引入哨兵机制后,解决了Redis主从架构Master故障时的主从切换问题,保证了Redis服务可用性.但依旧无法解决单机节点出现的写入性能瓶颈(网卡速率.单 ...

  9. #Python pandas库,读取模块,代码笔记

    日常数据清洗中,利用python清洗的第一步就是读取对应文件,今天一起复盘一下数据读取环节的常规操作. csv和xlsx格式读取类似,所以用csv做案例 X-MIND图

  10. pytest—添加日志

    开头 保存工作中常用的日志. pytest有自己的日志管理的开关,不需要用到python的日志库 开始 在文件根目录下新建一个pytest.ini文件 基本设置 [pytest] log_cli=tr ...