关于力扣 146LRU缓存机制问题

来源:2-1 有趣、简单的算法问题

qq_慕娘3016055

2021-11-24

以下贴上我的代码:

class LRUCache {

    int cap;

    LinkedList<Integerlist = new LinkedList<>();

    HashMap<Integer,Integermap;


    public LRUCache(int capacity) {

        this.cap = capacity;

        this.map = new HashMap<>(capacity);


    }

    public int get(int key) {

        if (!list.contains(key)) return -1;

        list.remove(Integer.valueOf(key));

        list.add(key);

        return map.get(key);

    }


    public void put(int keyint value) {

        if (list.contains(key)){

            list.remove(Integer.valueOf(key));

            list.add(key);

            map.put(key,value);

        }else if (list.size() == cap){

            int k = list.removeFirst();

            list.add(key);

            map.remove(k);

            map.put(key,value);

        }else {

            list.add(key);

            map.put(key,value);

        }

    }

}



我想请问一下,我这个算法超时了,有没有一些优化我这个算法的建议 能够通过



写回答

1回答

javaman

2021-11-25

同学 您好 List.Remove是线性查找并删除的。

建议把map的value改成list的iterator,这样查找到这个值后,可以直接从list里删除。

1
2
javaman
回复
qq_慕娘3016055
您好。我的意思是list.Remove效率非常低,每次需要线性查找。这个在get和put中一共出现了3次。 比较简单的方法是把HashMap换成LinkedListMap,因为LinkedListMap可以保证迭代顺序。然后get和put从map中查找后,如果能找到,都需要把原始的key/value从map中删掉,再插入。而且LinkedListMap仍然可以使用RemoveFirst之类的方法,时间复杂度是常数的。 替换为LinkedListMap后,就不需要单独的list了。 之前给的想法是把HashMap换成HashMap> 这样会比较麻烦,要同时维护list和map,并且可能需要不断调用listIterator(int index)来获得这个迭代器,复杂度也不低。
2021-11-26
共2条回复

算法面试刷题课--竞赛命题人带你刷70+高质量题型

只需20小时, Google面试官带你完成Java算法面试准备

539 学习 · 65 问题

查看课程