一道经典题目,用双向链表去做能够满足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. 颜值即正义,献礼就业季,打造多颜色多字体双飞翼布局技术简历模版(Resume)

    一年好景君须记,最是橙黄橘绿时.金三银四,秣马厉兵,没有一个好看的简历模板怎么行?无论是网上随便下载还是花钱买,都是一律千篇的老式模版,平平无奇,味同嚼蜡,没错,蜡都要沿着嘴角流下来了.本次我们基于H ...

  2. Kubernetes入门实践(环境搭建)

    容器技术只是解决了运维部署工作中的一个很小的问题,在现实生产环境中,除了最基本的安装,还会各式各样的需求,比如服务发现.负载均衡.状态监控.健康检查.扩容缩容.应用迁移.高可用等等.这些容器之上的管理 ...

  3. vue移动端预览 pdf 文件

    pdf预览,在项目中是很常见的需求,在PC端web项目中,我们可以使用window.open(url)直接打开pdf进行预览,那么移动端虽然我们也可以使用此方法,但是这是新开了一个webview页面, ...

  4. 推荐一个基于.Net Framework开发的Windows右键菜单管理工具

    平常在我们电脑,我们都会安装非常多的软件,很多软件默认都会向系统注册右键菜单功能,这样方便我们快捷打开.比如图片文件,通过右键的方式,快捷选择PS软件打开. 如果我们电脑安装非常多的软件,就会导致我们 ...

  5. abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  6. 2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号。

    2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号. 答案2023-02-18: 用 github.com/moonfdd/ffmpeg-go 这 ...

  7. 2021-01-10:linux中,我要看某一个进程的并发,通过什么命令去查?

    福哥答案2021-01-10:[答案来自此链接:](https://blog.csdn.net/sinat_31275315/article/details/108239492)方法一:PS在ps命令 ...

  8. 2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数的最大差值。要求:时间复杂度O(N) 。

    2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数的最大差值.要求:时间复杂度O(N) . 福大大 答案2021-05-20: 假设答案法.N个数,根据最大值和最小值的范围等分成N ...

  9. reverse逆转,即反向排序

    reverse逆转,即反向排序 print(Student.objects.all().exclude(nickname='A').reverse()

  10. 【工作随手记】deaklock排查

    生产环境当中还没真正遇到过死锁的问题.有些疑似死锁的问题,后来经过排查也只是其它问题导致的.所以通过jstack到底怎样排查死锁问题有点疏忽了.这里作个记录. 模拟一个死锁 顺便复习一下. 死锁的产生 ...