zoukankan      html  css  js  c++  java
  • LeetCode设计实现题(一)

    一、LRU缓存机制(LeetCode-146)

    1.1 题目描述

    1.2 解题思路

    思路1:

    使用Map存放key,value,使用List存放key和count,count为最新的index值,每次put、get操作都会使index自增。

    进行put操作时,如果发现超过容量值capacity,则对list中的count排序,map和list都删除掉index最小的元素。(提示超时)

    思路2:

    使用LinkedList,每次put操作或get操作,当list中没有该key的元素的时候,且不超过容量时,直接插入元素,若有则删除key对应的原有元素,插入key对应的新元素值。

    如果超过容量,则删除第一个元素,再添加进去。(通过)

    1.3 解题代码

    思路1:

    
    public class LRUCache {
    
        private Map<Integer, Integer> map = null;
        private List<HitCount> list = null;
        private Map<Integer, HitCount> locationMap = null;
        private int index = 0;
        private int capacity = 0;
    
    
        public LRUCache(int capacity) {
            map = new HashMap<>(capacity);
            list = new LinkedList<>();
            locationMap = new HashMap<>(capacity);
            this.capacity = capacity;
        }
    
        public int get(int key) {
            //先找到key-value
            Integer value = map.get(key);
            if (value == null) {
                return -1;
            }
    
            HitCount h = locationMap.get(key);
            h.setCount(++index);
            return value;
        }
    
        public void put(int key, int value) {
            //若key已存在
            Integer existValue = map.get(key);
            //容量不充足
            if (existValue == null && map.size() == capacity) {
                //找到命中次数最少的一个、若命中次数相同,则去除插入最早的
                HitCount leastKey = getLeastKey();
                map.remove(leastKey.getKey());
                list.remove(leastKey);
                locationMap.remove(leastKey.getKey());
            }
            HitCount h = null;
            if (existValue != null) {
                h = locationMap.get(key);
                h.setCount(++index);
            } else {
                h = new HitCount(key, ++index);
                list.add(h);
            }
            map.put(key, value);
            locationMap.put(key, h);
            index++;
        }
    
    
        private HitCount getLeastKey() {
            list = list.stream().sorted((u1, u2) -> (u1.getCount() - u2.getCount())).collect(Collectors.toList());
            return list.get(0);
        }
    
    
        class HitCount {
            private int key;
            private int count;
    
            HitCount(int key, int count) {
                this.key = key;
                this.count = count;
            }
    
            public int getKey() {
                return key;
            }
    
            public void setKey(int key) {
                this.key = key;
            }
    
            public int getCount() {
                return count;
            }
    
            public void setCount(int count) {
                this.count = count;
            }
    
        }
    
    }
    
    
    

    思路2:

    
    public class LRUCache {
    
        private List<LRUMap> list = null;
        private int capacity = 0;
    
        public LRUCache(int capacity) {
            list = new LinkedList<>();
            this.capacity = capacity;
        }
    
        public int get(int key) {
            Iterator iterator = list.iterator();
            while (iterator.hasNext()) {
                LRUMap node = (LRUMap) iterator.next();
                if (node.getKey() == key) {
                    int value = node.getValue();
                    list.remove(node);
                    list.add(new LRUMap(key, value));
                    return value;
                }
            }
            return -1;
        }
    
        public void put(int key, int value) {
            LRUMap node = new LRUMap(key, value);
    
            //查看该节点是否存在
            if (list.contains(node)) {
                list.remove(node);
            }
            //如果超过容量
            if (list.size() == capacity) {
                list.remove(0);
            }
            list.add(node);
    
        }
    
        class LRUMap {
    
            private int key;
            private int value;
    
            public LRUMap(int key, int value) {
                this.key = key;
                this.value = value;
            }
    
            public int getKey() {
                return key;
            }
    
            public void setKey(int key) {
                this.key = key;
            }
    
            public int getValue() {
                return value;
            }
    
            public void setValue(int value) {
                this.value = value;
            }
    
            @Override
            public boolean equals(Object obj) {
                if (obj == this) {
                    return true;
                }
                if (obj == null || obj.getClass() != this.getClass()) {
                    return false;
                }
    
                LRUMap map = (LRUMap) obj;
                return key == map.key;
            }
        }
    
    }
    
    
    
    
  • 相关阅读:
    The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
    HDU 5299 Circles Game
    UVALive
    算法笔记--匈牙利算法
    算法笔记--Splay && Link-Cut-Tree && fhq _treap
    P2685 [TJOI2012]桥
    2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
    ACM-ICPC2018南京赛区 Mediocre String Problem
    Project Euler 345: Matrix Sum
    算法笔记--manacher算法
  • 原文地址:https://www.cnblogs.com/fonxian/p/11484158.html
Copyright © 2011-2022 走看看